From 70fa16813e3422134f38488e770c6be64ce9dd3e Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 19 Jan 2016 16:54:40 +0000 Subject: [PATCH 01/12] Add 1.9 attributes --- .../java/net/canarymod/api/attributes/GenericAttribute.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/canarymod/api/attributes/GenericAttribute.java b/src/main/java/net/canarymod/api/attributes/GenericAttribute.java index 4cb13794..c2c1e0b0 100644 --- a/src/main/java/net/canarymod/api/attributes/GenericAttribute.java +++ b/src/main/java/net/canarymod/api/attributes/GenericAttribute.java @@ -14,6 +14,9 @@ public enum GenericAttribute { MOVEMENTSPEED("generic.movementSpeed"), ATTACKDAMAGE("generic.attackDamage"), KNOCKBACKRESIST("generic.knockbackResistance"), + ARMOR("generic.armor"), + ATTACKSPEED("generic.attackSpeed"), + LUCK("generic.luck"), ; private final String nmsName; @@ -29,5 +32,4 @@ public Attribute getAttribute() { public String getNativeName() { return this.nmsName; } - } From 50cb8d25784b05a33dc70802684eddaac10957d4 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 19 Jan 2016 16:59:54 +0000 Subject: [PATCH 02/12] Add 1.9 criteria types --- .../java/net/canarymod/api/scoreboard/CriteriaType.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/canarymod/api/scoreboard/CriteriaType.java b/src/main/java/net/canarymod/api/scoreboard/CriteriaType.java index cf0baecf..d7f7601b 100644 --- a/src/main/java/net/canarymod/api/scoreboard/CriteriaType.java +++ b/src/main/java/net/canarymod/api/scoreboard/CriteriaType.java @@ -12,7 +12,13 @@ public enum CriteriaType { DEATH_COUNT("deathCount"), PLAYER_KILL_COUNT("playerKillCount"), TOTAL_KILL_COUNT("totalKillCount"), - HEALTH("health"); + HEALTH("health"), + FOOD("food"), + AIR("air"), + ARMOR("armor"), + XP("xp"), + LEVEL("level"), + ; private String protocol; From 2cc7f2b7c9b7f14efa548e67400ae304b1bb08cc Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sun, 14 Feb 2016 22:47:22 +0000 Subject: [PATCH 03/12] Add 1.9 particle types and statistics --- .../canarymod/api/statistics/Statistics.java | 26 +++++++++++++++++-- .../canarymod/api/world/effects/Particle.java | 7 ++++- .../java/net/canarymod/chat/ChatFormat.java | 3 +-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/canarymod/api/statistics/Statistics.java b/src/main/java/net/canarymod/api/statistics/Statistics.java index d0309869..a5e387c9 100644 --- a/src/main/java/net/canarymod/api/statistics/Statistics.java +++ b/src/main/java/net/canarymod/api/statistics/Statistics.java @@ -38,12 +38,34 @@ public enum Statistics { JUNKFISHED("junkFished"), TREASUREFISHED("treasureFished"), TALKEDTOVILLAGER("talkedToVillager"), - TRADEDWITHVILLAGER("tradedWithVillager"),; + TRADEDWITHVILLAGER("tradedWithVillager"), + CAKESLICESEATEN("cakeSlicesEaten"), + CAULDRONFILLED("cauldronFilled"), + CAULDRONUSED("cauldronUsed"), + ARMORCLEANED("armorCleaned"), + BANNERCLEANED("bannerCleaned"), + BREWINGSTANDINTERACTION("brewingstandInteraction"), + BEACONINTERACTION("beaconInteraction"), + DROPPERINSPECTED("dropperInspected"), + HOPPERINSPECTED("hopperInspected"), + DISPENSERINSPECTED("dispenserInspected"), + NOTEBLOCKPLAYED("noteblockPlayed"), + NOTEBLOCKTUNED("noteblockTuned"), + FLOWERPOTTED("flowerPotted"), + TRAPPEDCHESTTRIGGERED("trappedChestTriggered"), + ENDERCHESTOPENED("enderchestOpened"), + ITEMENCHANTED("itemEnchanted"), + RECORDPLAYED("recordPlayed"), + FURNACEINTERACTION("furnaceInteraction"), + CRAFTINGTABLEINTERACTION("craftingTableInteraction"), + CHESTOPENED("chestOpened"), + SLEEPINBED("sleepInBed"), + ; private final String nmsName; private final static HashMap statisticsHashMap = Maps.newHashMap(); - private Statistics(String nmsName) { + Statistics(String nmsName) { this.nmsName = "stat.".concat(nmsName); } diff --git a/src/main/java/net/canarymod/api/world/effects/Particle.java b/src/main/java/net/canarymod/api/world/effects/Particle.java index 69573f26..8141dc4c 100644 --- a/src/main/java/net/canarymod/api/world/effects/Particle.java +++ b/src/main/java/net/canarymod/api/world/effects/Particle.java @@ -49,7 +49,12 @@ public enum Type { BLOCK_DUST("blockdust_"), WATER_DROP("droplet"), ITEM_TAKE("take"), - MOB_APPEARANCE("mobappearance"),; + MOB_APPEARANCE("mobappearance"), + DRAGON_BREATH("dragonbreath"), + END_ROD("endRod"), + DAMAGE_INDICATOR("damageIndicator"), + SWEEP_ATTACK("sweepAttack"), + ; private String mcName; diff --git a/src/main/java/net/canarymod/chat/ChatFormat.java b/src/main/java/net/canarymod/chat/ChatFormat.java index 4677cf0c..df4e54bd 100644 --- a/src/main/java/net/canarymod/chat/ChatFormat.java +++ b/src/main/java/net/canarymod/chat/ChatFormat.java @@ -5,7 +5,6 @@ * * @author Jason (darkdiplomat) */ - public enum ChatFormat { /** @@ -218,4 +217,4 @@ public static String formatString(String str, String marker) { public static final String consoleFormat(String text) { return text.replaceAll("\u00A7([A-FK-NRa-fk-nr0-9])", "&$1"); } -} \ No newline at end of file +} From 8ce191567b432247fc62bcefd558f2ca29cd33ee Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 22 Apr 2016 18:22:59 +0100 Subject: [PATCH 04/12] Add 1.9 arrow types --- .../java/net/canarymod/api/entity/Arrow.java | 13 +++++++ .../net/canarymod/api/entity/EntityType.java | 2 +- .../net/canarymod/api/entity/TippedArrow.java | 35 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/canarymod/api/entity/TippedArrow.java diff --git a/src/main/java/net/canarymod/api/entity/Arrow.java b/src/main/java/net/canarymod/api/entity/Arrow.java index c9589e5b..b8b52a74 100644 --- a/src/main/java/net/canarymod/api/entity/Arrow.java +++ b/src/main/java/net/canarymod/api/entity/Arrow.java @@ -7,6 +7,19 @@ */ public interface Arrow extends Entity, Projectile { + enum ArrowType { + NORMAL, + SPECTRAL, + TIPPED + } + + /** + * Gets the type of this Arrow. Currently either NORMAL, SPECTRAL or TIPPED + * + * @return the type + */ + ArrowType getArrowType(); + /** * Returns true if this Arrow can be retrieved by a Player * diff --git a/src/main/java/net/canarymod/api/entity/EntityType.java b/src/main/java/net/canarymod/api/entity/EntityType.java index a7c9ed93..fd0370a8 100644 --- a/src/main/java/net/canarymod/api/entity/EntityType.java +++ b/src/main/java/net/canarymod/api/entity/EntityType.java @@ -97,7 +97,7 @@ public enum EntityType { private final short id; private EntityType subtype; - private EntityType(int id, EntityType subtype) { + EntityType(int id, EntityType subtype) { this.id = (short)id; this.subtype = subtype; } diff --git a/src/main/java/net/canarymod/api/entity/TippedArrow.java b/src/main/java/net/canarymod/api/entity/TippedArrow.java new file mode 100644 index 00000000..11d3ce75 --- /dev/null +++ b/src/main/java/net/canarymod/api/entity/TippedArrow.java @@ -0,0 +1,35 @@ +package net.canarymod.api.entity; + +import net.canarymod.api.potion.PotionEffect; +import net.canarymod.api.potion.PotionType; + +import java.util.Set; + +/** + * Tipped Arrow wrapper + * + * @author Jamie Mansfield (jamierocks) + */ +public interface TippedArrow extends Arrow { + + /** + * Gets the type of potion used by this Arrow + * + * @return the potion type + */ + PotionType getPotionType(); + + /** + * Gets the potion effects applied to this Arrow + * + * @return the potion effects + */ + Set getPotionEffects(); + + /** + * Applies the specified potion effects to this Arrow + * + * @param potionEffects the potion effect(s) to apply + */ + void addPotionEffects(PotionEffect... potionEffects); +} From 48beec9d6f3b22737939d33af57d14a6e98974a9 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 5 Aug 2016 18:58:59 +0100 Subject: [PATCH 05/12] Add 1.9 block types, the Shulker, and the offhand --- pom.xml | 2 +- .../api/entity/living/monster/Shulker.java | 12 ++++++++++++ .../canarymod/api/inventory/PlayerInventory.java | 7 +++++++ .../canarymod/api/world/blocks/BlockType.java | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/canarymod/api/entity/living/monster/Shulker.java diff --git a/pom.xml b/pom.xml index b490a227..eedb28c0 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ net.canarymod CanaryLib jar - 1.2.1-SNAPSHOT + 1.3.0-SNAPSHOT CanaryLib http://www.canarymod.net 2012 diff --git a/src/main/java/net/canarymod/api/entity/living/monster/Shulker.java b/src/main/java/net/canarymod/api/entity/living/monster/Shulker.java new file mode 100644 index 00000000..3896dd8a --- /dev/null +++ b/src/main/java/net/canarymod/api/entity/living/monster/Shulker.java @@ -0,0 +1,12 @@ +package net.canarymod.api.entity.living.monster; + +import net.canarymod.api.entity.living.Golem; + +/** + * Shulker wrapper + * + * @author Jamie Mansfield (jamierocks) + */ +public interface Shulker extends EntityMob, Golem { + +} diff --git a/src/main/java/net/canarymod/api/inventory/PlayerInventory.java b/src/main/java/net/canarymod/api/inventory/PlayerInventory.java index 979223fc..bcffdfa7 100644 --- a/src/main/java/net/canarymod/api/inventory/PlayerInventory.java +++ b/src/main/java/net/canarymod/api/inventory/PlayerInventory.java @@ -81,6 +81,13 @@ public interface PlayerInventory extends Inventory { */ Item getItemInHand(); + /** + * Gets the current {@link Item} in offhand + * + * @return the {@link Item} in offhand + */ + Item getItemInOffhand(); + /** * Gets the current {@link Item} on the cursor * diff --git a/src/main/java/net/canarymod/api/world/blocks/BlockType.java b/src/main/java/net/canarymod/api/world/blocks/BlockType.java index eeac2862..9b8d878a 100644 --- a/src/main/java/net/canarymod/api/world/blocks/BlockType.java +++ b/src/main/java/net/canarymod/api/world/blocks/BlockType.java @@ -684,6 +684,22 @@ public final class BlockType { public static final BlockType JungleDoor = new BlockType(195, 0, "minecraft:jungle_door"); public static final BlockType AcaciaDoor = new BlockType(196, 0, "minecraft:acacia_door"); public static final BlockType DarkOakDoor = new BlockType(197, 0, "minecraft:dark_oak_door"); + public static final BlockType EndRod = new BlockType(198, 0, "minecraft:end_rod"); + public static final BlockType ChrousPlant = new BlockType(199, 0, "minecraft:chrous_plant"); + public static final BlockType ChorusFlower = new BlockType(200, 0, "minecraft:chorus_flower"); + public static final BlockType PurpurBlock = new BlockType(201, 0, "minecraft:purpur_block"); + public static final BlockType PurpurPillar = new BlockType(202, 0, "minecraft:purpur_pillar"); + public static final BlockType PurpurStairs = new BlockType(203, 0, "minecraft:purpur_stairs"); + public static final BlockType PurpurDoubleSlab = new BlockType(204, 0, "minecraft:purpur_double_slab"); + public static final BlockType PurpurSlab = new BlockType(205, 0, "minecraft:purpur_slab"); + public static final BlockType EndStoneBricks = new BlockType(206, 0, "minecraft:end_bricks"); + public static final BlockType BeetrootSeeds = new BlockType(207, 0, "minecraft:beetroot"); + public static final BlockType GrassPath = new BlockType(208, 0, "minecraft:grass_path"); + public static final BlockType EndGateway = new BlockType(209, 0, "minecraft:end_gateway"); + public static final BlockType RepeatingCommandBlock = new BlockType(210, 0, "minecraft:repeating_command_block"); + public static final BlockType ChainCommandBlock = new BlockType(211, 0, "minecraft:chain_command_block"); + public static final BlockType FrostedIce = new BlockType(212, 0, "minecraft:frosted_ice"); + public static final BlockType StructureBlock = new BlockType(255, 0, "minecraft:structure_block"); private static HashMap> blockTypes; private static HashMap> blocksByIdAndData; From 8d0648034174ea98be3e19905f6884eb8adc7733 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sat, 6 Aug 2016 13:22:53 +0100 Subject: [PATCH 06/12] Add 1.9 entity types, enchantments, potion effects, and tree types --- src/main/java/net/canarymod/api/entity/EntityType.java | 1 + .../java/net/canarymod/api/inventory/Enchantment.java | 3 +++ .../java/net/canarymod/api/potion/PotionEffectType.java | 9 +++++++++ src/main/java/net/canarymod/api/world/TreeType.java | 1 + 4 files changed, 14 insertions(+) diff --git a/src/main/java/net/canarymod/api/entity/EntityType.java b/src/main/java/net/canarymod/api/entity/EntityType.java index fd0370a8..1fd2a4da 100644 --- a/src/main/java/net/canarymod/api/entity/EntityType.java +++ b/src/main/java/net/canarymod/api/entity/EntityType.java @@ -71,6 +71,7 @@ public enum EntityType { POTION(16, GENERIC_THROWABLE), PRIEST(120, GENERIC_LIVING), SHEEP(91, GENERIC_ANIMAL), + SHULKER(68, GENERIC_MOB), SILVERFISH(60, GENERIC_MOB), SKELETON(51, GENERIC_MOB), SKELETONHORSE(100, GENERIC_ANIMAL), diff --git a/src/main/java/net/canarymod/api/inventory/Enchantment.java b/src/main/java/net/canarymod/api/inventory/Enchantment.java index 6de979e7..a49de7e8 100644 --- a/src/main/java/net/canarymod/api/inventory/Enchantment.java +++ b/src/main/java/net/canarymod/api/inventory/Enchantment.java @@ -39,6 +39,8 @@ enum Type { // DepthStrider(8), // + FrostWalker(9), + // Sharpness(16), // Smite(17), @@ -71,6 +73,7 @@ enum Type { // Lure(62), // + Mending(70), ; diff --git a/src/main/java/net/canarymod/api/potion/PotionEffectType.java b/src/main/java/net/canarymod/api/potion/PotionEffectType.java index 7f033814..e3eb3e75 100644 --- a/src/main/java/net/canarymod/api/potion/PotionEffectType.java +++ b/src/main/java/net/canarymod/api/potion/PotionEffectType.java @@ -53,6 +53,15 @@ public enum PotionEffectType { // SATURATION(23), // + GLOWING(24), + // + LEVITATION(25), + // + LUCK(26), + // + BADLUCK(27), + // + ; private final int id; diff --git a/src/main/java/net/canarymod/api/world/TreeType.java b/src/main/java/net/canarymod/api/world/TreeType.java index dcc04066..3a6c2aab 100644 --- a/src/main/java/net/canarymod/api/world/TreeType.java +++ b/src/main/java/net/canarymod/api/world/TreeType.java @@ -20,6 +20,7 @@ public enum TreeType { JUNGLEBUSH, MEGAJUNGLE, ACACIA, + CHORUSPLANT, /* I know, these technically aren't trees, but the Bukkit API has them and people will complain if these are here... */ REDMUSHROOM, From c8d27d565ab1ba1551f435a0a4a9acfd466f8c01 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sat, 6 Aug 2016 13:36:51 +0100 Subject: [PATCH 07/12] Add 1.10 blocks and polar bear --- src/main/java/net/canarymod/api/entity/EntityType.java | 1 + .../canarymod/api/entity/living/animal/PolarBear.java | 10 ++++++++++ .../java/net/canarymod/api/world/blocks/BlockType.java | 6 ++++++ 3 files changed, 17 insertions(+) create mode 100644 src/main/java/net/canarymod/api/entity/living/animal/PolarBear.java diff --git a/src/main/java/net/canarymod/api/entity/EntityType.java b/src/main/java/net/canarymod/api/entity/EntityType.java index 1fd2a4da..f1407460 100644 --- a/src/main/java/net/canarymod/api/entity/EntityType.java +++ b/src/main/java/net/canarymod/api/entity/EntityType.java @@ -68,6 +68,7 @@ public enum EntityType { PIG(90, GENERIC_ANIMAL), PIGZOMBIE(57, GENERIC_MOB), PLAYER(48, GENERIC_LIVING), + POLARBEAR(102, GENERIC_ANIMAL), POTION(16, GENERIC_THROWABLE), PRIEST(120, GENERIC_LIVING), SHEEP(91, GENERIC_ANIMAL), diff --git a/src/main/java/net/canarymod/api/entity/living/animal/PolarBear.java b/src/main/java/net/canarymod/api/entity/living/animal/PolarBear.java new file mode 100644 index 00000000..59bb99d9 --- /dev/null +++ b/src/main/java/net/canarymod/api/entity/living/animal/PolarBear.java @@ -0,0 +1,10 @@ +package net.canarymod.api.entity.living.animal; + +/** + * Polar Bear Wrapper + * + * @author Jamie Mansfield (jamierocks) + */ +public interface PolarBear extends EntityAnimal { + +} diff --git a/src/main/java/net/canarymod/api/world/blocks/BlockType.java b/src/main/java/net/canarymod/api/world/blocks/BlockType.java index 9b8d878a..a80ff1be 100644 --- a/src/main/java/net/canarymod/api/world/blocks/BlockType.java +++ b/src/main/java/net/canarymod/api/world/blocks/BlockType.java @@ -699,6 +699,12 @@ public final class BlockType { public static final BlockType RepeatingCommandBlock = new BlockType(210, 0, "minecraft:repeating_command_block"); public static final BlockType ChainCommandBlock = new BlockType(211, 0, "minecraft:chain_command_block"); public static final BlockType FrostedIce = new BlockType(212, 0, "minecraft:frosted_ice"); + public static final BlockType Magma = new BlockType(213, 0, "minecraft:magma"); + public static final BlockType NetherWart = new BlockType(214, 0, "minecraft:nether_wart_block"); + public static final BlockType RedNetherBrick = new BlockType(215, 0, "minecraft:red_nether_brick"); + public static final BlockType Bone = new BlockType(216, 0, "minecraft:bone_block"); + public static final BlockType StructureVoid = new BlockType(217, 0, "minecraft:structure_void"); + public static final BlockType StructureBlock = new BlockType(255, 0, "minecraft:structure_block"); private static HashMap> blockTypes; From 9d2e390aee007036e4fbe6c61bea5ed930f50e13 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sat, 23 Dec 2017 15:45:38 +0000 Subject: [PATCH 08/12] Add 1.9 breath sound effect (+ the remaining effects) This is the first PR in the series to not be backwards-compatible, and marks the start of 2.x.x. --- pom.xml | 2 +- .../api/world/effects/SoundEffect.java | 763 ++++++++++-------- 2 files changed, 444 insertions(+), 321 deletions(-) diff --git a/pom.xml b/pom.xml index eedb28c0..f3c2c0d4 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ net.canarymod CanaryLib jar - 1.3.0-SNAPSHOT + 2.0.0-SNAPSHOT CanaryLib http://www.canarymod.net 2012 diff --git a/src/main/java/net/canarymod/api/world/effects/SoundEffect.java b/src/main/java/net/canarymod/api/world/effects/SoundEffect.java index 9b8600f6..e3691062 100644 --- a/src/main/java/net/canarymod/api/world/effects/SoundEffect.java +++ b/src/main/java/net/canarymod/api/world/effects/SoundEffect.java @@ -13,326 +13,449 @@ public class SoundEffect { * @author Jason (darkdiplomat) */ public enum Type { - AMBIENCE_CAVE("ambient.cave.cave"), - // - AMBIENCE_RAIN("ambient.weather.rain"), - // - AMBIENCE_THUNDER("ambient.weather.thunder"), - // - ANVIL_BREAK("random.anvil_break"), - // - ANVIL_LAND("random.anvil_land"), - // - ANVIL_USE("random.anvil_use"), - // - BOW("random.bow"), - // - BOW_HIT("random.bowhit"), - // - BREATH("random.breath"), - // - BURP("random.burp"), - // - CHEST_CLOSED("random.chestclosed"), - // - CHEST_OPEN("random.chestopen"), - // - CLICK("random.click"), - // - DOOR_CLOSE("random.door_close"), - // - DOOR_OPEN("random.door_open"), - // - DRINK("random.drink"), - // - EAT("random.eat"), - // - EXPLODE("random.explode"), - // - FALL_BIG("damage.fallbig"), - // - FALL_SMALL("damage.fallsmall"), - // - FIRE("fire.fire"), - // - FIRE_IGNITE("fire.ignite"), - // - FIZZ("random.fizz"), - // - FUSE("random.fuse"), - // - GLASS("random.glass"), - // - HURT("random.classic_hurt"), - // - HURT_FLESH("damage.hit"), - // - ITEM_BREAK("random.break"), - // - ITEM_PICKUP("random.pop"), - // - LAVA("liquid.lava"), - // - LAVA_POP("liquid.lavapop"), - // - LEVEL_UP("random.levelup"), - // - LIQUID_SPLASH("liquid.splash"), - // - MINECART_BASE("minecart.base"), - // - MINECART_INSIDE("minecart.inside"), - // - NOTE_BASS("note.bass"), - // - NOTE_PIANO("note.harp"), - // - NOTE_BASS_DRUM("note.bd"), - // - NOTE_HAT("note.hat"), - // - NOTE_BASS_ATTACK("note.bassattack"), - // - NOTE_SNARE("note.snare"), - // - NOTE_PLING("note.pling"), - // - ORB("random.orb"), - // - PISTON_OUT("tile.piston.out"), - // - PISTON_IN("tile.piston.in"), - // - PORTAL("portal.portal"), - // - PORTAL_TRAVEL("portal.travel"), - // - PORTAL_TRIGGER("portal.trigger"), - // - SPLASH("random.splash"), - // - STEP_GRASS("step.grass"), - // - STEP_GRAVEL("step.gravel"), - // - STEP_LADDER("step.ladder"), - // - STEP_SAND("step.sand"), - // - STEP_SNOW("step.snow"), - // - STEP_STONE("step.stone"), - // - STEP_WOOD("step.wood"), - // - STEP_WOOL("step.cloth"), - // - SWIM("liquid.swim"), - // - WATER("liquid.water"), - // - WOOD_CLICK("random.wood click"), - // - // Das Mob sounds - BAT_DEATH("mob.bat.death"), - // - BAT_HURT("mob.bat.hurt"), - // - BAT_IDLE("mob.bat.idle"), - // - BAT_LOOP("mob.bat.loop"), - // - BAT_TAKEOFF("mob.bat.takeoff"), - // - BLAZE_BREATH("mob.blaze.breath"), - // - BLAZE_DEATH("mob.blaze.death"), - // - BLAZE_HIT("mob.blaze.hit"), - // - CAT_HISS("mob.cat.hiss"), - // - CAT_HIT("mob.cat.hitt"), - // - CAT_MEOW("mob.cat.meow"), - // - CAT_PURR("mob.cat.purr"), - // - CAT_PURREOW("mob.cat.purreow"), - // - CHICKEN_HURT("mob.chicken.hurt"), - // - CHICKEN_PLOP("mob.chicken.plop"), - // - CHICKEN_SAY("mob.chicken.say"), - // - CHICKEN_STEP("mob.chicken.step"), - // - COW_SAY("mob.cow.say"), - // - COW_HURT("mob.cow.hurt"), - // - COW_STEP("mob.cow.step"), - // - CREEPER_DEATH("mob.creeper.death"), - // - CREEPER_SAY("mob.creeper.say"), - // - ENDERDRAGON_END("mob.enderdragon.end"), - // - ENDERDRAGON_GROWL("mob.enderdragon.growl"), - // - ENDERDRAGON_HIT("mob.enderdragon.hit"), - // - ENDERDRAGON_WINGS("mob.enderdragon.wings"), - // - ENDERMAN_DEATH("mob.endermen.death"), - // - ENDERMAN_HIT("mob.endermen.hit"), - // - ENDERMAN_IDLE("mob.endermen.idle"), - // - ENDERMAN_PORTAL("mob.endermen.portal"), - // - ENDERMAN_SCREAM("mob.endermen.scream"), - // - ENDERMAN_STARE("mob.endermen.stare"), - // - GHAST_SCREAM("mob.ghast.scream"), - // - GHAST_AFFECTIONATE_SCREAM("mob.ghast.affectionate scream"), - // - GHAST_CHARGE("mob.ghast.charge"), - // - GHAST_DEATH("mob.ghast.death"), - // - GHAST_FIREBALL("mob.ghast.fireball"), - // - GHAST_MOAN("mob.ghast.moan"), - // - IRONGOLEM_DEATH("mob.irongolem.death"), - // - IRONGOLEM_HIT("mob.irongolem.hit"), - // - IRONGOLEM_THROW("mob.irongolem.throw"), - // - IRONGOLEM_WALK("mob.irongolem.walk"), - // - MAGMACUBE_BIG("mob.magmacube.big"), - // - MAGMACUBE_JUMP("mob.magmacube.jump"), - // - MAGMACUBE_SMALL("mob.magmacube.small"), - // - PIG_DEATH("mob.pig.death"), - // - PIG_SAY("mob.pig.say"), - // - PIG_STEP("mob.pig.step"), - // - SHEEP_SAY("mob.sheep.say"), - // - SHEEP_SHEAR("mob.sheep.shear"), - // - SHEEP_STEP("mob.sheep.step"), - // - SILVERFISH_HIT("mob.silverfish.hit"), - // - SILVERFISH_KIL("mob.silverfish.kill"), - // - SILVERFISH_SAY("mob.silverfish.say"), - // - SILVERFISH_STEP("mob.silverfish.step"), - // - SKELETON_DEATH("mob.skeleton.death"), - // - SKELETON_HURT("mob.skeleton.hurt"), - // - SKELETON_SAY("mob.skeleton.say"), - // - SKELETON_STEP("mob.skeleton.step"), - // - SLIME_ATTACK("mob.slime.attack"), - // - SLIME_BIG("mob.slime.big"), - // - SLIME_SMALL("mob.slime.small"), - // - SPIDER_DEATH("mob.spider.death"), - // - SPIDER_SAY("mob.spider.say"), - // - SPIDER_STEP("mob.spider.step"), - // - WITHER_DEATH("mob.wither.death"), - // - WITHER_HURT("mob.wither.hurt"), - // - WITHER_IDLE("mob.wither.idle"), - // - WITHER_SHOOT("mob.wither.shoot"), - // - WITHER_SPAWN("mob.wither.spawn"), - // - WOLF_BARK("mob.wolf.bark"), - // - WOLF_DEATH("mob.wolf.death"), - // - WOLF_GROWL("mob.wolf.growl"), - // - WOLF_HOWL("mob.wolf.howl"), - // - WOLF_HURT("mob.wolf.hurt"), - // - WOLF_PANT("mob.wolf.panting"), - // - WOLF_SHAKE("mob.wolf.shake"), - // - WOLF_STEP("mob.wolf.step"), - // - WOLF_WHINE("mob.wolf.whine"), - // - ZOMBIE_METAL("mob.zombie.metal"), - // - ZOMBIE_WOOD("mob.zombie.wood"), - // - ZOMBIE_WOODBREAK("mob.zombie.woodbreak"), - // - ZOMBIE_SAY("mob.zombie.say"), - // - ZOMBIE_DEATH("mob.zombie.death"), - // - ZOMBIE_HURT("mob.zombie.hurt"), - // - ZOMBIE_INFECT("mob.zombie.infect"), - // - ZOMBIE_UNFECT("mob.zombie.unfect"), - // - ZOMBIE_REMEDY("mob.zombie.remedy"), - // - ZOMBIE_PIG_IDLE("mob.zombiepig.zpig"), - // - ZOMBIE_PIG_ANGRY("mob.zombiepig.zpigangry"), - // - ZOMBIE_PIG_DEATH("mob.zombiepig.zpigdeath"), - // - ZOMBIE_PIG_HURT("mob.zombiepig.zpighurt"), - // - // Digging Sounds - DIG_CLOTH("dig.cloth"), - // - DIG_GRASS("dig.grass"), - // - DIG_GRAVEL("dig.gravel"), - // - DIG_SAND("dig.sand"), - // - DIG_SNOW("dig.snow"), - // - DIG_STONE("dig.stone"), - // - DIG_WOOD("dig.wood"), - // + AMBIENT_CAVE("ambient.cave"), + BLOCK_ANVIL_BREAK("block.anvil.break"), + BLOCK_ANVIL_DESTROY("block.anvil.destroy"), + BLOCK_ANVIL_FALL("block.anvil.fall"), + BLOCK_ANVIL_HIT("block.anvil.hit"), + BLOCK_ANVIL_LAND("block.anvil.land"), + BLOCK_ANVIL_PLACE("block.anvil.place"), + BLOCK_ANVIL_STEP("block.anvil.step"), + BLOCK_ANVIL_USE("block.anvil.use"), + ENTITY_ARMORSTAND_BREAK("entity.armorstand.break"), + ENTITY_ARMORSTAND_FALL("entity.armorstand.fall"), + ENTITY_ARMORSTAND_HIT("entity.armorstand.hit"), + ENTITY_ARMORSTAND_PLACE("entity.armorstand.place"), + ITEM_ARMOR_EQUIP_CHAIN("item.armor.equip_chain"), + ITEM_ARMOR_EQUIP_DIAMOND("item.armor.equip_diamond"), + ITEM_ARMOR_EQUIP_GENERIC("item.armor.equip_generic"), + ITEM_ARMOR_EQUIP_GOLD("item.armor.equip_gold"), + ITEM_ARMOR_EQUIP_IRON("item.armor.equip_iron"), + ITEM_ARMOR_EQUIP_LEATHER("item.armor.equip_leather"), + ENTITY_ARROW_HIT("entity.arrow.hit"), + ENTITY_ARROW_HIT_PLAYER("entity.arrow.hit_player"), + ENTITY_ARROW_SHOOT("entity.arrow.shoot"), + ENTITY_BAT_AMBIENT("entity.bat.ambient"), + ENTITY_BAT_DEATH("entity.bat.death"), + ENTITY_BAT_HURT("entity.bat.hurt"), + ENTITY_BAT_LOOP("entity.bat.loop"), + ENTITY_BAT_TAKEOFF("entity.bat.takeoff"), + ENTITY_BLAZE_AMBIENT("entity.blaze.ambient"), + ENTITY_BLAZE_BURN("entity.blaze.burn"), + ENTITY_BLAZE_DEATH("entity.blaze.death"), + ENTITY_BLAZE_HURT("entity.blaze.hurt"), + ENTITY_BLAZE_SHOOT("entity.blaze.shoot"), + ENTITY_BOBBER_SPLASH("entity.bobber.splash"), + ENTITY_BOBBER_THROW("entity.bobber.throw"), + ITEM_BOTTLE_FILL("item.bottle.fill"), + ITEM_BOTTLE_FILL_DRAGONBREATH("item.bottle.fill_dragonbreath"), + BLOCK_BREWING_STAND_BREW("block.brewing_stand.brew"), + ITEM_BUCKET_EMPTY("item.bucket.empty"), + ITEM_BUCKET_EMPTY_LAVA("item.bucket.empty_lava"), + ITEM_BUCKET_FILL("item.bucket.fill"), + ITEM_BUCKET_FILL_LAVA("item.bucket.fill_lava"), + ENTITY_CAT_AMBIENT("entity.cat.ambient"), + ENTITY_CAT_DEATH("entity.cat.death"), + ENTITY_CAT_HISS("entity.cat.hiss"), + ENTITY_CAT_HURT("entity.cat.hurt"), + ENTITY_CAT_PURR("entity.cat.purr"), + ENTITY_CAT_PURREOW("entity.cat.purreow"), + BLOCK_CHEST_CLOSE("block.chest.close"), + BLOCK_CHEST_LOCKED("block.chest.locked"), + BLOCK_CHEST_OPEN("block.chest.open"), + ENTITY_CHICKEN_AMBIENT("entity.chicken.ambient"), + ENTITY_CHICKEN_DEATH("entity.chicken.death"), + ENTITY_CHICKEN_EGG("entity.chicken.egg"), + ENTITY_CHICKEN_HURT("entity.chicken.hurt"), + ENTITY_CHICKEN_STEP("entity.chicken.step"), + BLOCK_CHORUS_FLOWER_DEATH("block.chorus_flower.death"), + BLOCK_CHORUS_FLOWER_GROW("block.chorus_flower.grow"), + ITEM_CHORUS_FRUIT_TELEPORT("item.chorus_fruit.teleport"), + BLOCK_CLOTH_BREAK("block.cloth.break"), + BLOCK_CLOTH_FALL("block.cloth.fall"), + BLOCK_CLOTH_HIT("block.cloth.hit"), + BLOCK_CLOTH_PLACE("block.cloth.place"), + BLOCK_CLOTH_STEP("block.cloth.step"), + BLOCK_COMPARATOR_CLICK("block.comparator.click"), + ENTITY_COW_AMBIENT("entity.cow.ambient"), + ENTITY_COW_DEATH("entity.cow.death"), + ENTITY_COW_HURT("entity.cow.hurt"), + ENTITY_COW_MILK("entity.cow.milk"), + ENTITY_COW_STEP("entity.cow.step"), + ENTITY_CREEPER_DEATH("entity.creeper.death"), + ENTITY_CREEPER_HURT("entity.creeper.hurt"), + ENTITY_CREEPER_PRIMED("entity.creeper.primed"), + BLOCK_DISPENSER_DISPENSE("block.dispenser.dispense"), + BLOCK_DISPENSER_FAIL("block.dispenser.fail"), + BLOCK_DISPENSER_LAUNCH("block.dispenser.launch"), + ENTITY_DONKEY_AMBIENT("entity.donkey.ambient"), + ENTITY_DONKEY_ANGRY("entity.donkey.angry"), + ENTITY_DONKEY_CHEST("entity.donkey.chest"), + ENTITY_DONKEY_DEATH("entity.donkey.death"), + ENTITY_DONKEY_HURT("entity.donkey.hurt"), + ENTITY_EGG_THROW("entity.egg.throw"), + ENTITY_ELDER_GUARDIAN_AMBIENT("entity.elder_guardian.ambient"), + ENTITY_ELDERGUARDIAN_AMBIENTLAND("entity.elder_guardian.ambient_land"), + ENTITY_ELDER_GUARDIAN_CURSE("entity.elder_guardian.curse"), + ENTITY_ELDER_GUARDIAN_DEATH("entity.elder_guardian.death"), + ENTITY_ELDER_GUARDIAN_DEATH_LAND("entity.elder_guardian.death_land"), + ENTITY_ELDER_GUARDIAN_HURT("entity.elder_guardian.hurt"), + ENTITY_ELDER_GUARDIAN_HURT_LAND("entity.elder_guardian.hurt_land"), + BLOCK_ENDERCHEST_CLOSE("block.enderchest.close"), + BLOCK_ENDERCHEST_OPEN("block.enderchest.open"), + ENTITY_ENDERDRAGON_AMBIENT("entity.enderdragon.ambient"), + ENTITY_ENDERDRAGON_DEATH("entity.enderdragon.death"), + ENTITY_ENDERDRAGON_FIREBALL_EPLD("entity.enderdragon_fireball.explode"), + ENTITY_ENDERDRAGON_FLAP("entity.enderdragon.flap"), + ENTITY_ENDERDRAGON_GROWL("entity.enderdragon.growl"), + ENTITY_ENDERDRAGON_HURT("entity.enderdragon.hurt"), + ENTITY_ENDERDRAGON_SHOOT("entity.enderdragon.shoot"), + ENTITY_ENDEREYE_LAUNCH("entity.endereye.launch"), + ENTITY_ENDERMEN_AMBIENT("entity.endermen.ambient"), + ENTITY_ENDERMEN_DEATH("entity.endermen.death"), + ENTITY_ENDERMEN_HURT("entity.endermen.hurt"), + ENTITY_ENDERMEN_SCREAM("entity.endermen.scream"), + ENTITY_ENDERMEN_STARE("entity.endermen.stare"), + ENTITY_ENDERMEN_TELEPORT("entity.endermen.teleport"), + ENTITY_ENDERMITE_AMBIENT("entity.endermite.ambient"), + ENTITY_ENDERMITE_DEATH("entity.endermite.death"), + ENTITY_ENDERMITE_HURT("entity.endermite.hurt"), + ENTITY_ENDERMITE_STEP("entity.endermite.step"), + ENTITY_ENDERPEARL_THROW("entity.enderpearl.throw"), + BLOCK_END_GATEWAY_SPAWN("block.end_gateway.spawn"), + ENTITY_EXPERIENCE_BOTTLE_THROW("entity.experience_bottle.throw"), + ENTITY_EXPERIENCE_ORB_PICKUP("entity.experience_orb.pickup"), + ENTITY_EXPERIENCE_ORB_TOUCH("entity.experience_orb.touch"), + BLOCK_FENCE_GATE_CLOSE("block.fence_gate.close"), + BLOCK_FENCE_GATE_OPEN("block.fence_gate.open"), + ITEM_FIRECHARGE_USE("item.firecharge.use"), + ENTITY_FIREWORK_BLAST("entity.firework.blast"), + ENTITY_FIREWORK_BLAST_FAR("entity.firework.blast_far"), + ENTITY_FIREWORK_LARGE_BLAST("entity.firework.large_blast"), + ENTITY_FIREWORK_LARGE_BLAST_FAR("entity.firework.large_blast_far"), + ENTITY_FIREWORK_LAUNCH("entity.firework.launch"), + ENTITY_FIREWORK_SHOOT("entity.firework.shoot"), + ENTITY_FIREWORK_TWINKLE("entity.firework.twinkle"), + ENTITY_FIREWORK_TWINKLE_FAR("entity.firework.twinkle_far"), + BLOCK_FIRE_AMBIENT("block.fire.ambient"), + BLOCK_FIRE_EXTINGUISH("block.fire.extinguish"), + ITEM_FLINTANDSTEEL_USE("item.flintandsteel.use"), + BLOCK_FURNACE_FIRE_CRACKLE("block.furnace.fire_crackle"), + ENTITY_GENERIC_BIG_FALL("entity.generic.big_fall"), + ENTITY_GENERIC_BURN("entity.generic.burn"), + ENTITY_GENERIC_DEATH("entity.generic.death"), + ENTITY_GENERIC_DRINK("entity.generic.drink"), + ENTITY_GENERIC_EAT("entity.generic.eat"), + ENTITY_GENERIC_EXPLODE("entity.generic.explode"), + ENTITY_GENERIC_EXTINGUISH_FIRE("entity.generic.extinguish_fire"), + ENTITY_GENERIC_HURT("entity.generic.hurt"), + ENTITY_GENERIC_SMALL_FALL("entity.generic.small_fall"), + ENTITY_GENERIC_SPLASH("entity.generic.splash"), + ENTITY_GENERIC_SWIM("entity.generic.swim"), + ENTITY_GHAST_AMBIENT("entity.ghast.ambient"), + ENTITY_GHAST_DEATH("entity.ghast.death"), + ENTITY_GHAST_HURT("entity.ghast.hurt"), + ENTITY_GHAST_SCREAM("entity.ghast.scream"), + ENTITY_GHAST_SHOOT("entity.ghast.shoot"), + ENTITY_GHAST_WARN("entity.ghast.warn"), + BLOCK_GLASS_BREAK("block.glass.break"), + BLOCK_GLASS_FALL("block.glass.fall"), + BLOCK_GLASS_HIT("block.glass.hit"), + BLOCK_GLASS_PLACE("block.glass.place"), + BLOCK_GLASS_STEP("block.glass.step"), + BLOCK_GRASS_BREAK("block.grass.break"), + BLOCK_GRASS_FALL("block.grass.fall"), + BLOCK_GRASS_HIT("block.grass.hit"), + BLOCK_GRASS_PLACE("block.grass.place"), + BLOCK_GRASS_STEP("block.grass.step"), + BLOCK_GRAVEL_BREAK("block.gravel.break"), + BLOCK_GRAVEL_FALL("block.gravel.fall"), + BLOCK_GRAVEL_HIT("block.gravel.hit"), + BLOCK_GRAVEL_PLACE("block.gravel.place"), + BLOCK_GRAVEL_STEP("block.gravel.step"), + ENTITY_GUARDIAN_AMBIENT("entity.guardian.ambient"), + ENTITY_GUARDIAN_AMBIENT_LAND("entity.guardian.ambient_land"), + ENTITY_GUARDIAN_ATTACK("entity.guardian.attack"), + ENTITY_GUARDIAN_DEATH("entity.guardian.death"), + ENTITY_GUARDIAN_DEATH_LAND("entity.guardian.death_land"), + ENTITY_GUARDIAN_FLOP("entity.guardian.flop"), + ENTITY_GUARDIAN_HURT("entity.guardian.hurt"), + ENTITY_GUARDIAN_HURT_LAND("entity.guardian.hurt_land"), + ITEM_HOE_TILL("item.hoe.till"), + ENTITY_HORSE_AMBIENT("entity.horse.ambient"), + ENTITY_HORSE_ANGRY("entity.horse.angry"), + ENTITY_HORSE_ARMOR("entity.horse.armor"), + ENTITY_HORSE_BREATHE("entity.horse.breathe"), + ENTITY_HORSE_DEATH("entity.horse.death"), + ENTITY_HORSE_EAT("entity.horse.eat"), + ENTITY_HORSE_GALLOP("entity.horse.gallop"), + ENTITY_HORSE_HURT("entity.horse.hurt"), + ENTITY_HORSE_JUMP("entity.horse.jump"), + ENTITY_HORSE_LAND("entity.horse.land"), + ENTITY_HORSE_SADDLE("entity.horse.saddle"), + ENTITY_HORSE_STEP("entity.horse.step"), + ENTITY_HORSE_STEP_WOOD("entity.horse.step_wood"), + ENTITY_HOSTILE_BIG_FALL("entity.hostile.big_fall"), + ENTITY_HOSTILE_DEATH("entity.hostile.death"), + ENTITY_HOSTILE_HURT("entity.hostile.hurt"), + ENTITY_HOSTILE_SMALL_FALL("entity.hostile.small_fall"), + ENTITY_HOSTILE_SPLASH("entity.hostile.splash"), + ENTITY_HOSTILE_SWIM("entity.hostile.swim"), + ENTITY_IRONGOLEM_ATTACK("entity.irongolem.attack"), + ENTITY_IRONGOLEM_DEATH("entity.irongolem.death"), + ENTITY_IRONGOLEM_HURT("entity.irongolem.hurt"), + ENTITY_IRONGOLEM_STEP("entity.irongolem.step"), + BLOCK_IRON_DOOR_CLOSE("block.iron_door.close"), + BLOCK_IRON_DOOR_OPEN("block.iron_door.open"), + BLOCK_IRON_TRAPDOOR_CLOSE("block.iron_trapdoor.close"), + BLOCK_IRON_TRAPDOOR_OPEN("block.iron_trapdoor.open"), + ENTITY_ITEMFRAME_ADD_ITEM("entity.itemframe.add_item"), + ENTITY_ITEMFRAME_BREAK("entity.itemframe.break"), + ENTITY_ITEMFRAME_PLACE("entity.itemframe.place"), + ENTITY_ITEMFRAME_REMOVE_ITEM("entity.itemframe.remove_item"), + ENTITY_ITEMFRAME_ROTATE_ITEM("entity.itemframe.rotate_item"), + ENTITY_ITEM_BREAK("entity.item.break"), + ENTITY_ITEM_PICKUP("entity.item.pickup"), + BLOCK_LADDER_BREAK("block.ladder.break"), + BLOCK_LADDER_FALL("block.ladder.fall"), + BLOCK_LADDER_HIT("block.ladder.hit"), + BLOCK_LADDER_PLACE("block.ladder.place"), + BLOCK_LADDER_STEP("block.ladder.step"), + BLOCK_LAVA_AMBIENT("block.lava.ambient"), + BLOCK_LAVA_EXTINGUISH("block.lava.extinguish"), + BLOCK_LAVA_POP("block.lava.pop"), + ENTITY_LEASHKNOT_BREAK("entity.leashknot.break"), + ENTITY_LEASHKNOT_PLACE("entity.leashknot.place"), + BLOCK_LEVER_CLICK("block.lever.click"), + ENTITY_LIGHTNING_IMPACT("entity.lightning.impact"), + ENTITY_LIGHTNING_THUNDER("entity.lightning.thunder"), + ENTITY_LINGERINGPOTION_THROW("entity.lingeringpotion.throw"), + ENTITY_MAGMACUBE_DEATH("entity.magmacube.death"), + ENTITY_MAGMACUBE_HURT("entity.magmacube.hurt"), + ENTITY_MAGMACUBE_JUMP("entity.magmacube.jump"), + ENTITY_MAGMACUBE_SQUISH("entity.magmacube.squish"), + BLOCK_METAL_BREAK("block.metal.break"), + BLOCK_METAL_FALL("block.metal.fall"), + BLOCK_METAL_HIT("block.metal.hit"), + BLOCK_METAL_PLACE("block.metal.place"), + BLOCK_METAL_PRESSPLATE_CLICK_OFF("block.metal_pressureplate.click_off"), + BLOCK_METAL_PRESSPLATE_CLICK_ON("block.metal_pressureplate.click_on"), + BLOCK_METAL_STEP("block.metal.step"), + ENTITY_MINECART_INSIDE("entity.minecart.inside"), + ENTITY_MINECART_RIDING("entity.minecart.riding"), + ENTITY_MOOSHROOM_SHEAR("entity.mooshroom.shear"), + ENTITY_MULE_AMBIENT("entity.mule.ambient"), + ENTITY_MULE_DEATH("entity.mule.death"), + ENTITY_MULE_HURT("entity.mule.hurt"), + MUSIC_CREATIVE("music.creative"), + MUSIC_CREDITS("music.credits"), + MUSIC_DRAGON("music.dragon"), + MUSIC_END("music.end"), + MUSIC_GAME("music.game"), + MUSIC_MENU("music.menu"), + MUSIC_NETHER("music.nether"), + BLOCK_NOTE_BASEDRUM("block.note.basedrum"), + BLOCK_NOTE_BASS("block.note.bass"), + BLOCK_NOTE_HARP("block.note.harp"), + BLOCK_NOTE_HAT("block.note.hat"), + BLOCK_NOTE_PLING("block.note.pling"), + BLOCK_NOTE_SNARE("block.note.snare"), + ENTITY_PAINTING_BREAK("entity.painting.break"), + ENTITY_PAINTING_PLACE("entity.painting.place"), + ENTITY_PIG_AMBIENT("entity.pig.ambient"), + ENTITY_PIG_DEATH("entity.pig.death"), + ENTITY_PIG_HURT("entity.pig.hurt"), + ENTITY_PIG_SADDLE("entity.pig.saddle"), + ENTITY_PIG_STEP("entity.pig.step"), + BLOCK_PISTON_CONTRACT("block.piston.contract"), + BLOCK_PISTON_EXTEND("block.piston.extend"), + ENTITY_PLAYER_ATTACK_CRIT("entity.player.attack.crit"), + ENTITY_PLAYER_ATTACK_KNOCKBACK("entity.player.attack.knockback"), + ENTITY_PLAYER_ATTACK_NODAMAGE("entity.player.attack.nodamage"), + ENTITY_PLAYER_ATTACK_STRONG("entity.player.attack.strong"), + ENTITY_PLAYER_ATTACK_SWEEP("entity.player.attack.sweep"), + ENTITY_PLAYER_ATTACK_WEAK("entity.player.attack.weak"), + ENTITY_PLAYER_BIG_FALL("entity.player.big_fall"), + ENTITY_PLAYER_BREATH("entity.player.breath"), + ENTITY_PLAYER_BURP("entity.player.burp"), + ENTITY_PLAYER_DEATH("entity.player.death"), + ENTITY_PLAYER_HURT("entity.player.hurt"), + ENTITY_PLAYER_LEVELUP("entity.player.levelup"), + ENTITY_PLAYER_SMALL_FALL("entity.player.small_fall"), + ENTITY_PLAYER_SPLASH("entity.player.splash"), + ENTITY_PLAYER_SWIM("entity.player.swim"), + BLOCK_PORTAL_AMBIENT("block.portal.ambient"), + BLOCK_PORTAL_TRAVEL("block.portal.travel"), + BLOCK_PORTAL_TRIGGER("block.portal.trigger"), + ENTITY_RABBIT_AMBIENT("entity.rabbit.ambient"), + ENTITY_RABBIT_ATTACK("entity.rabbit.attack"), + ENTITY_RABBIT_DEATH("entity.rabbit.death"), + ENTITY_RABBIT_HURT("entity.rabbit.hurt"), + ENTITY_RABBIT_JUMP("entity.rabbit.jump"), + RECORD_11("record.11"), + RECORD_13("record.13"), + RECORD_BLOCKS("record.blocks"), + RECORD_CAT("record.cat"), + RECORD_CHIRP("record.chirp"), + RECORD_FAR("record.far"), + RECORD_MALL("record.mall"), + RECORD_MELLOHI("record.mellohi"), + RECORD_STAL("record.stal"), + RECORD_STRAD("record.strad"), + RECORD_WAIT("record.wait"), + RECORD_WARD("record.ward"), + BLOCK_REDSTONE_TORCH_BURNOUT("block.redstone_torch.burnout"), + BLOCK_SAND_BREAK("block.sand.break"), + BLOCK_SAND_FALL("block.sand.fall"), + BLOCK_SAND_HIT("block.sand.hit"), + BLOCK_SAND_PLACE("block.sand.place"), + BLOCK_SAND_STEP("block.sand.step"), + ENTITY_SHEEP_AMBIENT("entity.sheep.ambient"), + ENTITY_SHEEP_DEATH("entity.sheep.death"), + ENTITY_SHEEP_HURT("entity.sheep.hurt"), + ENTITY_SHEEP_SHEAR("entity.sheep.shear"), + ENTITY_SHEEP_STEP("entity.sheep.step"), + ITEM_SHIELD_BLOCK("item.shield.block"), + ITEM_SHIELD_BREAK("item.shield.break"), + ITEM_SHOVEL_FLATTEN("item.shovel.flatten"), + ENTITY_SHULKER_AMBIENT("entity.shulker.ambient"), + ENTITY_SHULKER_BULLET_HIT("entity.shulker_bullet.hit"), + ENTITY_SHULKER_BULLET_HURT("entity.shulker_bullet.hurt"), + ENTITY_SHULKER_CLOSE("entity.shulker.close"), + ENTITY_SHULKER_DEATH("entity.shulker.death"), + ENTITY_SHULKER_HURT("entity.shulker.hurt"), + ENTITY_SHULKER_HURT_CLOSED("entity.shulker.hurt_closed"), + ENTITY_SHULKER_OPEN("entity.shulker.open"), + ENTITY_SHULKER_SHOOT("entity.shulker.shoot"), + ENTITY_SHULKER_TELEPORT("entity.shulker.teleport"), + ENTITY_SILVERFISH_AMBIENT("entity.silverfish.ambient"), + ENTITY_SILVERFISH_DEATH("entity.silverfish.death"), + ENTITY_SILVERFISH_HURT("entity.silverfish.hurt"), + ENTITY_SILVERFISH_STEP("entity.silverfish.step"), + ENTITY_SKELETON_AMBIENT("entity.skeleton.ambient"), + ENTITY_SKELETON_DEATH("entity.skeleton.death"), + ENTITY_SKELETON_HORSE_AMBIENT("entity.skeleton_horse.ambient"), + ENTITY_SKELETON_HORSE_DEATH("entity.skeleton_horse.death"), + ENTITY_SKELETON_HORSE_HURT("entity.skeleton_horse.hurt"), + ENTITY_SKELETON_HURT("entity.skeleton.hurt"), + ENTITY_SKELETON_SHOOT("entity.skeleton.shoot"), + ENTITY_SKELETON_STEP("entity.skeleton.step"), + ENTITY_SLIME_ATTACK("entity.slime.attack"), + BLOCK_SLIME_BREAK("block.slime.break"), + ENTITY_SLIME_DEATH("entity.slime.death"), + BLOCK_SLIME_FALL("block.slime.fall"), + BLOCK_SLIME_HIT("block.slime.hit"), + ENTITY_SLIME_HURT("entity.slime.hurt"), + ENTITY_SLIME_JUMP("entity.slime.jump"), + BLOCK_SLIME_PLACE("block.slime.place"), + ENTITY_SLIME_SQUISH("entity.slime.squish"), + BLOCK_SLIME_STEP("block.slime.step"), + ENTITY_SMALL_MAGMACUBE_DEATH("entity.small_magmacube.death"), + ENTITY_SMALL_MAGMACUBE_HURT("entity.small_magmacube.hurt"), + ENTITY_SMALL_MAGMACUBE_SQUISH("entity.small_magmacube.squish"), + ENTITY_SMALL_SLIME_DEATH("entity.small_slime.death"), + ENTITY_SMALL_SLIME_HURT("entity.small_slime.hurt"), + ENTITY_SMALL_SLIME_JUMP("entity.small_slime.jump"), + ENTITY_SMALL_SLIME_SQUISH("entity.small_slime.squish"), + ENTITY_SNOWBALL_THROW("entity.snowball.throw"), + ENTITY_SNOWMAN_AMBIENT("entity.snowman.ambient"), + ENTITY_SNOWMAN_DEATH("entity.snowman.death"), + ENTITY_SNOWMAN_HURT("entity.snowman.hurt"), + ENTITY_SNOWMAN_SHOOT("entity.snowman.shoot"), + BLOCK_SNOW_BREAK("block.snow.break"), + BLOCK_SNOW_FALL("block.snow.fall"), + BLOCK_SNOW_HIT("block.snow.hit"), + BLOCK_SNOW_PLACE("block.snow.place"), + BLOCK_SNOW_STEP("block.snow.step"), + ENTITY_SPIDER_AMBIENT("entity.spider.ambient"), + ENTITY_SPIDER_DEATH("entity.spider.death"), + ENTITY_SPIDER_HURT("entity.spider.hurt"), + ENTITY_SPIDER_STEP("entity.spider.step"), + ENTITY_SPLASH_POTION_BREAK("entity.splash_potion.break"), + ENTITY_SPLASH_POTION_THROW("entity.splash_potion.throw"), + ENTITY_SQUID_AMBIENT("entity.squid.ambient"), + ENTITY_SQUID_DEATH("entity.squid.death"), + ENTITY_SQUID_HURT("entity.squid.hurt"), + BLOCK_STONE_BREAK("block.stone.break"), + BLOCK_STONE_BUTTON_CLICK_OFF("block.stone_button.click_off"), + BLOCK_STONE_BUTTON_CLICK_ON("block.stone_button.click_on"), + BLOCK_STONE_FALL("block.stone.fall"), + BLOCK_STONE_HIT("block.stone.hit"), + BLOCK_STONE_PLACE("block.stone.place"), + BLOCK_STONE_PRESSPLATE_CLICK_OFF("block.stone_pressureplate.click_off"), + BLOCK_STONE_PRESSPLATE_CLICK_ON("block.stone_pressureplate.click_on"), + BLOCK_STONE_STEP("block.stone.step"), + ENCHANT_THORNS_HIT("enchant.thorns.hit"), + ENTITY_TNT_PRIMED("entity.tnt.primed"), + BLOCK_TRIPWIRE_ATTACH("block.tripwire.attach"), + BLOCK_TRIPWIRE_CLICK_OFF("block.tripwire.click_off"), + BLOCK_TRIPWIRE_CLICK_ON("block.tripwire.click_on"), + BLOCK_TRIPWIRE_DETACH("block.tripwire.detach"), + UI_BUTTON_CLICK("ui.button.click"), + ENTITY_VILLAGER_AMBIENT("entity.villager.ambient"), + ENTITY_VILLAGER_DEATH("entity.villager.death"), + ENTITY_VILLAGER_HURT("entity.villager.hurt"), + ENTITY_VILLAGER_NO("entity.villager.no"), + ENTITY_VILLAGER_TRADING("entity.villager.trading"), + ENTITY_VILLAGER_YES("entity.villager.yes"), + BLOCK_WATERLILY_PLACE("block.waterlily.place"), + BLOCK_WATER_AMBIENT("block.water.ambient"), + WEATHER_RAIN("weather.rain"), + WEATHER_RAIN_ABOVE("weather.rain.above"), + ENTITY_WITCH_AMBIENT("entity.witch.ambient"), + ENTITY_WITCH_DEATH("entity.witch.death"), + ENTITY_WITCH_DRINK("entity.witch.drink"), + ENTITY_WITCH_HURT("entity.witch.hurt"), + ENTITY_WITCH_THROW("entity.witch.throw"), + ENTITY_WITHER_AMBIENT("entity.wither.ambient"), + ENTITY_WITHER_BREAK_BLOCK("entity.wither.break_block"), + ENTITY_WITHER_DEATH("entity.wither.death"), + ENTITY_WITHER_HURT("entity.wither.hurt"), + ENTITY_WITHER_SHOOT("entity.wither.shoot"), + ENTITY_WITHER_SPAWN("entity.wither.spawn"), + ENTITY_WOLF_AMBIENT("entity.wolf.ambient"), + ENTITY_WOLF_DEATH("entity.wolf.death"), + ENTITY_WOLF_GROWL("entity.wolf.growl"), + ENTITY_WOLF_HOWL("entity.wolf.howl"), + ENTITY_WOLF_HURT("entity.wolf.hurt"), + ENTITY_WOLF_PANT("entity.wolf.pant"), + ENTITY_WOLF_SHAKE("entity.wolf.shake"), + ENTITY_WOLF_STEP("entity.wolf.step"), + ENTITY_WOLF_WHINE("entity.wolf.whine"), + BLOCK_WOODEN_DOOR_CLOSE("block.wooden_door.close"), + BLOCK_WOODEN_DOOR_OPEN("block.wooden_door.open"), + BLOCK_WOODEN_TRAPDOOR_CLOSE("block.wooden_trapdoor.close"), + BLOCK_WOODEN_TRAPDOOR_OPEN("block.wooden_trapdoor.open"), + BLOCK_WOOD_BREAK("block.wood.break"), + BLOCK_WOOD_BUTTON_CLICK_OFF("block.wood_button.click_off"), + BLOCK_WOOD_BUTTON_CLICK_ON("block.wood_button.click_on"), + BLOCK_WOOD_FALL("block.wood.fall"), + BLOCK_WOOD_HIT("block.wood.hit"), + BLOCK_WOOD_PLACE("block.wood.place"), + BLOCK_WOOD_PRESSPLATE_CLICK_OFF("block.wood_pressureplate.click_off"), + BLOCK_WOOD_PRESSPLATE_CLICK_ON("block.wood_pressureplate.click_on"), + BLOCK_WOOD_STEP("block.wood.step"), + ENTITY_ZOMBIE_AMBIENT("entity.zombie.ambient"), + ENTITY_ZOMBIE_ATTACK_DOOR_WOOD("entity.zombie.attack_door_wood"), + ENTITY_ZOMBIE_ATTACK_IRON_DOOR("entity.zombie.attack_iron_door"), + ENTITY_ZOMBIE_BREAK_DOOR_WOOD("entity.zombie.break_door_wood"), + ENTITY_ZOMBIE_DEATH("entity.zombie.death"), + ENTITY_ZOMBIE_HORSE_AMBIENT("entity.zombie_horse.ambient"), + ENTITY_ZOMBIE_HORSE_DEATH("entity.zombie_horse.death"), + ENTITY_ZOMBIE_HORSE_HURT("entity.zombie_horse.hurt"), + ENTITY_ZOMBIE_HURT("entity.zombie.hurt"), + ENTITY_ZOMBIE_INFECT("entity.zombie.infect"), + ENTITY_ZOMBIE_PIG_AMBIENT("entity.zombie_pig.ambient"), + ENTITY_ZOMBIE_PIG_ANGRY("entity.zombie_pig.angry"), + ENTITY_ZOMBIE_PIG_DEATH("entity.zombie_pig.death"), + ENTITY_ZOMBIE_PIG_HURT("entity.zombie_pig.hurt"), + ENTITY_ZOMBIE_STEP("entity.zombie.step"), + ENTITY_ZOMBIE_VILLAGER_AMBIENT("entity.zombie_villager.ambient"), + ENTITY_ZOMBIE_VILLAGER_CONVERTED("entity.zombie_villager.converted"), + ENTITY_ZOMBIE_VILLAGER_CURE("entity.zombie_villager.cure"), + ENTITY_ZOMBIE_VILLAGER_DEATH("entity.zombie_villager.death"), + ENTITY_ZOMBIE_VILLAGER_HURT("entity.zombie_villager.hurt"), + ENTITY_ZOMBIE_VILLAGER_STEP("entity.zombie_villager.step"), ; private String mcName; From 1b78a27504d15de901a1a4ae7a103fee48811598 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sat, 23 Dec 2017 16:06:04 +0000 Subject: [PATCH 09/12] Add 1.10 sound effects --- .../api/world/effects/SoundEffect.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/net/canarymod/api/world/effects/SoundEffect.java b/src/main/java/net/canarymod/api/world/effects/SoundEffect.java index e3691062..70d7b478 100644 --- a/src/main/java/net/canarymod/api/world/effects/SoundEffect.java +++ b/src/main/java/net/canarymod/api/world/effects/SoundEffect.java @@ -88,6 +88,7 @@ public enum Type { BLOCK_DISPENSER_DISPENSE("block.dispenser.dispense"), BLOCK_DISPENSER_FAIL("block.dispenser.fail"), BLOCK_DISPENSER_LAUNCH("block.dispenser.launch"), + BLOCK_ENCHANTMENT_TABLE_USE("block.enchantment_table.use"), ENTITY_DONKEY_AMBIENT("entity.donkey.ambient"), ENTITY_DONKEY_ANGRY("entity.donkey.angry"), ENTITY_DONKEY_CHEST("entity.donkey.chest"), @@ -201,6 +202,10 @@ public enum Type { ENTITY_HOSTILE_SMALL_FALL("entity.hostile.small_fall"), ENTITY_HOSTILE_SPLASH("entity.hostile.splash"), ENTITY_HOSTILE_SWIM("entity.hostile.swim"), + ENTITY_HUSK_AMBIENT("entity.husk.ambient"), + ENTITY_HUSK_DEATH("entity.husk.death"), + ENTITY_HUSK_HURT("entity.husk.hurt"), + ENTITY_HUSK_STEP("entity.husk.step"), ENTITY_IRONGOLEM_ATTACK("entity.irongolem.attack"), ENTITY_IRONGOLEM_DEATH("entity.irongolem.death"), ENTITY_IRONGOLEM_HURT("entity.irongolem.hurt"), @@ -284,6 +289,12 @@ public enum Type { ENTITY_PLAYER_SMALL_FALL("entity.player.small_fall"), ENTITY_PLAYER_SPLASH("entity.player.splash"), ENTITY_PLAYER_SWIM("entity.player.swim"), + ENTITY_POLAR_BEAR_AMBIENT("entity.polar_bear.ambient"), + ENTITY_POLAR_BEAR_BABY_AMBIENT("entity.polar_bear.baby_ambient"), + ENTITY_POLAR_BEAR_DEATH("entity.polar_bear.death"), + ENTITY_POLAR_BEAR_HURT("entity.polar_bear.hurt"), + ENTITY_POLAR_BEAR_STEP("entity.polar_bear.step"), + ENTITY_POLAR_BEAR_WARNING("entity.polar_bear.warning"), BLOCK_PORTAL_AMBIENT("block.portal.ambient"), BLOCK_PORTAL_TRAVEL("block.portal.travel"), BLOCK_PORTAL_TRIGGER("block.portal.trigger"), @@ -376,6 +387,10 @@ public enum Type { ENTITY_SQUID_AMBIENT("entity.squid.ambient"), ENTITY_SQUID_DEATH("entity.squid.death"), ENTITY_SQUID_HURT("entity.squid.hurt"), + ENTITY_STRAY_AMBIENT("entity.stray.ambient"), + ENTITY_STRAY_DEATH("entity.stray.death"), + ENTITY_STRAY_HURT("entity.stray.hurt"), + ENTITY_STRAY_STEP("entity.stray.step"), BLOCK_STONE_BREAK("block.stone.break"), BLOCK_STONE_BUTTON_CLICK_OFF("block.stone_button.click_off"), BLOCK_STONE_BUTTON_CLICK_ON("block.stone_button.click_on"), @@ -413,6 +428,10 @@ public enum Type { ENTITY_WITHER_HURT("entity.wither.hurt"), ENTITY_WITHER_SHOOT("entity.wither.shoot"), ENTITY_WITHER_SPAWN("entity.wither.spawn"), + ENTITY_WITHER_SKELETON_AMBIENT("entity.wither_skeleton.ambient"), + ENTITY_WITHER_SKELETON_DEATH("entity.wither_skeleton.death"), + ENTITY_WITHER_SKELETON_HURT("entity.wither_skeleton.hurt"), + ENTITY_WITHER_SKELETON_STEP("entity.wither_skeleton.step"), ENTITY_WOLF_AMBIENT("entity.wolf.ambient"), ENTITY_WOLF_DEATH("entity.wolf.death"), ENTITY_WOLF_GROWL("entity.wolf.growl"), From 2be5c6777c128c10238dde287e1c65ec9e62f6aa Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sun, 31 Dec 2017 00:38:57 +0000 Subject: [PATCH 10/12] Switch to Gradle --- build.gradle | 78 ++++ gradle.properties | 3 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54731 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 ++++++++ gradlew.bat | 84 ++++ pom.xml | 370 ------------------ settings.gradle | 2 + src/main/java/net/canarymod/Canary.java | 10 +- .../canarymod/api/world/blocks/BlockType.java | 4 +- .../canarymod/util/NullPlayerInventory.java | 5 + 11 files changed, 356 insertions(+), 377 deletions(-) create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..6542795f --- /dev/null +++ b/build.gradle @@ -0,0 +1,78 @@ +apply plugin: 'java' + +group = 'net.canarymod' +version = '2.0.0-SNAPSHOT' + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +repositories { + mavenLocal() + mavenCentral() + maven { + name 'vi-repo' + url 'http://repo.visualillusionsent.net/repository/internal/' + } + maven { + name 'vi-snapshots' + url 'http://repo.visualillusionsent.net/repository/snapshots/' + } + maven { + name 'mojang' + url 'https://libraries.minecraft.net/' + } + maven { + name 'mcstats' + url 'http://repo.mcstats.org/content/repositories/releases/' + } + maven { + name 'mcstats.snapshots' + url 'http://repo.mcstats.org/content/repositories/snapshots/' + } +} + +dependencies { + // Provided by Minecraft + compile 'org.apache.logging.log4j:log4j-api:2.0-beta9' + compile 'com.google.guava:guava:21.0' + compile 'com.mojang:authlib:1.5.21' + + // Other + compile 'net.visualillusionsent:viutils:1.4.2' + compile 'org.jdom:jdom2:2.0.5' + compile 'com.mchange:c3p0:0.9.5' + compile 'com.googlecode.json-simple:json-simple:1.1.1' + compile 'org.mcstats.standalone:metrics:R7' + + // Runtime + compile 'org.xerial:sqlite-jdbc:3.8.7' + compile 'mysql:mysql-connector-java:5.1.34' + + testCompile 'junit:junit:4.12' +} + +// Source compiler configuration +tasks.withType(JavaCompile) { + options.compilerArgs += ['-Xlint:all', '-Xlint:-path', '-parameters'] + options.deprecation = true + options.encoding = 'UTF-8' +} + +javadoc { + options.encoding = 'UTF-8' + options.charSet = 'UTF-8' + options.links( + 'https://logging.apache.org/log4j/2.x/log4j-api/apidocs/', + 'https://google.github.io/guava/releases/21.0/api/docs/', + 'http://www.jdom.org/docs/apidocs/', + 'http://www.mchange.com/projects/c3p0/apidocs/', + 'https://docs.oracle.com/javase/8/docs/api/' + ) + + // Disable the crazy super-strict doclint tool in Java 8 + options.addStringOption('Xdoclint:none', '-quiet') +} + +task wrapper(type: Wrapper) { + gradleVersion = '4.1' +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..ad93ae55 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +name = CanaryLib +url = http://www.canarymod.net +inceptionYear = 2012 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..6b6ea3ab4ff4f69d55c5fd9c0a6ac70f47d41008 GIT binary patch literal 54731 zcmagFV|ZrKvM!pAZQHhO+qP}9lTNfnHSl14(}!ze#uNJ zOwq~Ee}g>(n5P|-=+d-fQIs8&nEo1Q%{sw3$GLO8b^Z2lL;fA*|Ct;3-)|>ZtN&|S z|6d)r|I)E?H8Hoh_#ai#{#Dh>)x_D^!u9_$x%Smfzy3S)@4vr>;Xj**Iyt$!x&O6S zFtKq|b2o8yw{T@Nvo~>bi`CTeTF^xPLZ3(@6UVgr1|-kXM%ou=mdwiYxeB+94NgzDs+mE)Ga+Ly^k_UH5C z*$Tw4Ux`)JTW`clSj;wSpTkMxf3h5LYZ1X_d)yXW39j4pj@5OViiw2LqS+g3&3DWCnmgtrSQI?dL z?736Cw-uVf{12@tn8aO-Oj#09rPV4r!sQb^CA#PVOYHVQ3o4IRb=geYI24u(TkJ_i zeIuFQjqR?9MV`{2zUTgY&5dir>e+r^4-|bz zj74-^qyKBQV;#1R!8px8%^jiw!A6YsZkWLPO;$jv-(VxTfR1_~!I*Ys2nv?I7ysM0 z7K{`Zqkb@Z6lPyZmo{6M9sqY>f5*Kxy8XUbR9<~DHaC-1vv_JhtwqML&;rnKLSx&ip0h7nfzl)zBI70rUw7GZa>0*W8ARZjPnUuaPO!C08To znN$lYRGtyx)d$qTbYC^yIq&}hvN86-JEfSOr=Yk3K+pnGXWh^}0W_iMI@ z#=E=vL~t~qMd}^8FwgE_Mh}SWQp}xh?Ptbx$dzRPv77DIaRJ6o>qaYHSfE+_iS}ln z;@I!?iQl?8_2qITV{flaG_57C@=ALS|2|j7vjAC>jO<&MGec#;zQk%z4%%092eYXS z$fem@kSEJ6vQ-mH7!LNN>6H<_FOv{e5MDoMMwlg-afq#-w|Zp`$bZd80?qenAuQDk z@eKC-BaSg(#_Mhzv-DkTBi^iqwhm+jr8Jk2l~Ov2PKb&p^66tp9fM#(X?G$bNO0Qi#d^7jA2|Yb{Dty# z%ZrTuE9^^3|C$RP+WP{0rkD?)s2l$4{Trw&a`MBWP^5|ePiRe)eh1Krh{58%6G`pp zynITQL*j8WTo+N)p9HdEIrj0Sk^2vNlH_(&Cx0|VryTNz?8rT;(%{mcd2hFfqoh+7 z%)@$#TT?X0%)UQOD6wQ@!e3UK20`qWR$96Bs_lLEKCz0CM~I;EhNQ)YC8*fhAp;-y zG9ro^VEXfQj~>oiXu^b~#H=cDFq1m~pQM-f9r{}qrS#~je-yDxh1&sV2w@HhbD%rQ zvqF(aK|1^PfDY)2QmT*?RbqHsa?*q%=?fqC^^43G)W3!c>kxCx;=d>6@4rI!pHEJ4 zCoe~PClhmWmVca=0Wk`&1I)-_+twVqbe>EhaLa(aej;ZQMt%`{F?$#pnW~;_IHaAz zA#|5>{v!dxN&ouieHdb~fuGo>qW(ax^of8<3X{&(+Br@1bJ-0D6Chg$u$TReI=h+y zn=&-aBZ`g+mci#-+(2$LD5yFHMAVg8vNINQOHN6e4|jQhIb$~sO;+G?IYshZf)V{ZewQR z?(|^o>0Xre^gj!6e}> zTHb#iYu$Pe=|&3Y8bm`B=667b-*KMXwSbr9({a6%5J<}HiX`8&@sTKOHJuGG}oFsx9y^}APB2zP0xIzxS_Hyg5{(XFBs z^>x@qc<{m0R5JuE`~*Xx7j+Mlh8yU;#jl1$rp4`hqz$;RC(C47%q!OKCIUijULB^8 z@%X9OuE)qY7Y3_p2)FZG`{jy-MTvXFVG>m?arA&;;8L#XXv_zYE+xzlG3w?7{|{(+ z2PBOSHD7x?RN0^yTs(HvAFmAfOrff>@4q|H*h<19zai;uT@_RhlZef4L?;a`f&ps% z144>YiGZ|W%_IOSwunC&S$T1Z&LDI1EpAN4{D|F_9c^cK8`g zQ4t*yzU*=>_rK=h1_qv3NR56)5-ZsGV}C?MxA2mI>g$u>i9xQqxTY3CP6SFlmqT*kJm+Vp&6|Rd&HVjVV2iE;dO7g%DBvpKxz}%|=eqatxbO9J z26Tmn5nFnvGuWhCeQ?Xl{9b3Zn?76X;Ed_yB`4Tuh{@)~0u0g-+Z&_LbVuvfXZ0hi z<)Dcp(7mi{4J2=wr$jn!SYp3yKg*nj)GwiiYeB6=Jz5 ze_>nw@IjCW&>1ztev$h~1=OFs*n#QYa*6y3!u>`NWVdsD^W6FZ)$O=LbgMzY=6aNW zplFoLX0&iKqna6%IMp|Pv~7NW-SmpI>TkgLhX&(~iQtdJ4)~YUD3|+3J-`WfB|P2T zKia5&pE5L|hjvX`9gmw7v=bVal$_n*B&#A(4ZvvYVPfl@PI(5e!i4KS_sd`yS0R*R zt|Yp((|SofnsEsS8|&NyWo{U<<66>|)Ny{8(!hRcc&anv%ru(Oac)?%qn}g3etD=i zt6c#E^r&Ee#V}}Gw*0b1*n829iQ&QWLudUqSuO3_7xb~%Y!oRTVaOEei3o>?hmsf) z;_S_U>QXOG$fT6jv$dsI*kSvnPz=lrX#`RUNgb><2ex!06DPaN9^bVm^9pB1w&da} zI*&uh$!}B4)}{XY$ZZ6Nm0DP#+Y&@Ip9K%wCd;-QFPlDRJHLtFX~{V>`?TLxj8*x9 z*jS4bpX>d!Y&MZQ6EDrOY)o3BTi4E%6^Mp#l zq~RuQGD*{Kt9jrupV_gAjFggPSviGh)%1f35fvMk zrQGJZx2EnWQBy8XP+BjYan<&eGzs{tifUr7v1YdZH&>PQ$B7|UWPCr_Dp`oC%^0Rx zRsQMQ7@_=I8}s$7eOHa7i>cw?BIWKXa(W9-?dj+%`j)E%hfDjn$ywH=Zkko}o96NuqwWpty9I2QtUU6%Hh#}_->hVJ-f711&8$r7V~O^7sth1qdm+?fD?&gIjAc zyqFI*LNCe9r)#GW?r@x@=2cx756awNnnx7U6`y?7hMG~_*tSv_iX)jBjoam}%=SnL zQ>U^OCihLy24_3n!SV-gS zOc&9qhB7Ek%eZMq6j(?A@-DKtoAhCsG+Uuq3MlDQHgk4SY)xK$_R~$fy+|1^I3G2_ z%5Ss|QBcETpy^7Fak21m_;GRNFx4lC$y8Fsv?Ai^RuL6`{ZB<{Vh#&W=x%}TG%(@; zT)NU7Dy$MnbU{*R-74J&=92U75>jfM3qQ=|sBrk_gUpJ|3@m-(S} zqrmISaynDD_ioO6)*i^7o0;!bDMmWp0YMpaG8btAu^OJ)=_<07isXtT+3lF76nBJ{ z`;coD)dJ6*+R@2)aG#M$ba<~O=E&W~Ufgk7r@zL&qQ~h_DGzk<>-6*EUF#I+(fVvF zF0q3(GM8?WRWvoMY~XEg>9%PN1tw>wLt5DP-`2`e)KL%jgPt=`R_Tf+MJBwzz@6P` zYkcqgt{25RF6%_*@D6opLzleQ)7W@Gs4H3i#4LADwy$Js;!`pfiwBoJts0Aw#g{Mb zYooE6OW7NcUMd1}sH)Ri=3(K0WmBtvK!2KaY?U&Htr#Q|+gK<+)P!19dIyUlV-~ZD zWTnl`xcUr)m5@2S1Lk4U(6nbH$;vl%qb5Vh|G5KA{_*04p!LOkPsWhxMRz}sl&mDWMOvz5;Kq0`+&T6$VoLdpvEBn-UN`Yb8ZZ0wMcv3XC z&vdicA-t=}LW3(&B6Kj(>TT!YHdrG%6Mp}$B2)7 z+;)t8QsBkfxDOo?z_{=$3mKym5Go;g$Mk=-laVV$8~3tYKU*>B?!wZzsj%|0`(rDZ zQlak~9a?7KG<`P_r`)fK5tmRtfJx2_{|%4C{wGh4l@LS$tQ$Tbg&CH~tGKZcy%EgW z`Ej2=-Hlzs6Deb(!HzY)2>45_jU5(2ZZtAeg#)2VsD^#*$8x<;w5s&*^tt+nA0nto#6hJ&M?xQ5=lhI*Tap+o@#YI~Hi-l#@sdjZ4PCVcFr zrtJF2C$N~X&6L4W47_$Flt4D!po1W~)1L9HNr#|W_L09d`a-4_H0Mx`rv5icDMbTk zjgibis*{cth+j!U;jr1ejW?${hBE1{p6EKm8=(ABt9m z73d7-{oHvvZQ4|t%Yl|k2ISat%`52J25OJ=M|CD{m|Q`~Q%t0|TS>zV%Z(g_Tfm4* zrnW_nWqsh&V(Vg+lY`u)?gp>c{g&12){~5SxL)&$i>$($pDhnsXK=$u3m0Cx-kD$+ z5Sf?E*TYQ#^KvHWJU1%*={yG9NjM(7`Q)rS7&uMenLoOe2N*xk(vN5F{sf(%CH8#I;sdqf1dw%kBI&pS`K)){>EF18AT6CAYZz0_Bc|Ws1Nh3 z%twB`i+Lm2(%hoXJP|J5lGpD^-5BDO7S(}JJ>5B*GC`HoszjIH2&%(H9^gwUpLh!i z3Qy1nE2J}h@;Ak+bcPP0N_i9XP zGP%F-_xo6mx<}RTyu}Gtjo&rvdJ)cjDjdsF2#cIzUZPQ4jw3ooBicqI*=>s6PhTHP zUbqtt70zm3RGvU{bmEBy@7>pUvN*V&xd}e^Utpe0V;b_!mCArr(MJKQnMqizhhON$ z0PU2%@B_9xKJKKe6`VjcwmWC;Y0r{P@{$)pR~JK z7W*a7V+;ltQ(0F8#ai=9MTrhuKUuc?XHbAd#{@4h9w}rzVRuq6yXejFE!8sdL8=54 zlMy{taj5+w=D#noC@!#8;au}K+eZu|Qu0-kgkp6xNYzcURuN-6Kl%)%2VR8!wVGU1 zWZEqJTSbol6_)?Gn*57aSh-rbxyjqOxm!5?6VUdE?S~B!MwhszTd>6tpLmj(o$a(h zAs07xg*#7|8#vhWTd4=LC(iu_{`BjJsuC)6y+j zVt~bjACA>0y~vnuy8LtP`50?}Sv@t*JN-yL!!hVgrCPk1MZ}gKt0uixMw>b}LVSYT zO2tkmt!7v#jQQ>8j*U6`G)hEPOU>LGS_Bb0_fM;F-V(W)wq65Rk*aya3yO z_E*B&%-+Mz#?wO5#@<52%(}O6W4o%BNVbB8s4!4(PR*gSb z$j7Eencvf9?_))K7b19T597Ql)q~!PlMm$u$j3)NoBF(=YuwSFa=2J3EM=@!qJ=bK z2UY^`gcpl_0a{Nbh&mL-S}|dXDc@FYTzkR9u>DlO|r9zMbY9 zcvi~*Sn!-XdibS9>V|VmH54$J!N;-k>U|!e$!EePWpr0wZn4~|?w4vo%-Ffcx{+}N z74+Dx>^&$SsYtq~oLkztY&j;cG5S5NN)rYFS~F@`)MVA%911fMO^vLB+%;E2kGcx|C?bj%K*Y#Btv7K6inqIt~eN9{d@I&&(VF z1}bT14cQy!1jpa|7DiCJuBh_{+56)f_l3}qLWwox4&D>1NwX@~lG&(9Cp!ZS@vbCbV>$9jV0PWrUoc zGQm`Y5){E1K~q2RUK#=U*e^6&?8-y!fP9=6o+W+4nm+mSQeDNJD5!E8CaU;I#+HM)Gt`;3%$yq7H_kqm0#(U8c<8HUpZ5@8zRzEG5L^AX4{< zwDEN(lUW!^k%H!t&T_;T6To1i4r0S|tu+lWr|`3wjbo+~>MjOj62{&D3H$OiWs=Dw z`m6MW^8|~J3*ER5G^h~UbH*UPW$7ZHfg&@9%r2u(d@8YN94k?}pzw`3tuCNVl%MV&<#4ESfo@VX7dX=)C-e#!(E` z#+;b>rvW^#ug1(yr&cS%w96I($;2(O*FuVoTK-KiA2Qgwkhs0^Xt=eXkh&mx)iBSK z+r|&Xi($%(!3BO6G7f)2qliGTP)G50)i_iAAQYn_^v$7h=>j<98G2H|p1$BA(xe5i z0+-b-VX6A*!r*B>W<`WMPAsKiypzr_G25*NMBd*U0dSwuCz+0CPmX1%rGDw|L|sg- zFo|-kDGXpl#GVVhHIe#KRr^fX8dd>odTlP=D0<~ke(zU1xB8^1);p2#8t_>~o&?jKIG49W)EmhTo5fZ|aP=E2~}6=bv=O`0e4FpgaP@U~KHt>V*oR z{wKtxe`uCFdgYHlbLL2`H>|$?L@G&exvem8R^wQppk+Gu8BI;LR4v=pU`U4vlmwFw zxYbNZXbzdqO{7#b`Eo2>XlNcQEFC-Gk2v__^hqHG{bb%6gvMRe9ikQ>94zOK3o85` z)Ew{!is}|b0%g#qa2H+$A1i=5;*y)hv$5m)&;Z~CTv zpdZz#9k)yhrLH%G>|ly;%|Fe`K{}d{6vyNO^Gk$ZYOIL$3&5XuJTqse&XvY7TH(_z zb3L0aT`$6i&c(dBQVcLsV?yM^@BTj>C_2=Ih6Yxsk zP5r-Yg34bu;lJUUrT!1Gt>I?jD(&Q8A@Ag5=i&TcT(g><60QjPmt>;B(xYk(bt}+T z4_t3m_flhFXrd}o9hw+M$vh0Ej(*GdO21EJaL-eD*b$UHHZnUN|OJ z0Jp^;Ep{EvhbQw6K_&t~eB7m4_csSE=CWXyWY4sLL-`>gdwbXUqW8FqVwQ((K>Hes z6?QDu2SZjI&_Oqc`A&D$)~oa&r%dn2G?-*9nvEt&L!4PeU(lyXCgK1^guGj|F$M$j z(GuZXkiyMXV}lhNuz5oi;9>+0nCgNO|gp>9FS%CFa9W(t_WRn1h zi*Vk4IQG@3-{J`U=9`Ky!DmF2O%ld1w#`8Drc@C6KGz2^NhY^gQZo9SG}}BF9G0<> zUIO))F&%dt6uAb`cN%_jf&q5I)?_7J^9T09fb~#ll%%T{?}PznT^_22(*OROJ`X;tg`78+=eW z{nLQs1%;?R)4yhs=QXy;Ww3ta7dfE~<&UNFZ#6bKVY=m1@p+4G(=Yx{7vDsa`}d$v2%*jQt+wTN!@Q4~!T4`0#GI8YfG!RD zA-RJ))sAlYej5x5RQ-^2I`1%|`iFfD*JoRd`hJ1Hjq_1EjBZ7V)S;?@^TS;{^==d= z)f-C;4#XD*THtvXh>{A80hZC?O(tJ)M}tK1Z4n%Y}= z7G#ciWgC-qm?9fE0?893;j3|Em(+qaH${U|Z^A^QleR%Z7 z1tb3_8mwUDjv6g+M+PH*#OmXvrsOq;C|~Oa;`LR+=Ou;zBgy?^)d&PxR|BoHj6&sQLvauxiJO7V_3Dc#Yum zGB>eK>>aZ64e9dY{FHaG&8nfRUW*u+r;2EK&_#d;m#{&#@xVG;SRy=AUe9+PcYYs7 zj96WKYn5YVi{SKZ^0v}b<>~7D3U^W@eJTVKCDk#O!fc5%`1KJ%473-~Ep)z$w6SC^ zTLzy~^~c+8J4q^gv9G_h((u6+#9K|Hwyv?kkbEpaO6^U013F*&bbnuxwtH~v%F9#0 zmtLmWALa{|zD`KnzKOv=DK^Qdb+qyOnd??*IXEprOa{&tVKg3pExuAFe~YQ4t|)j) zij8hA%U)XCd1Xs~{O?y^$^Ay>@J#8GF%+8%LcH*p@gmDRZXB5qIXD z8>)QYQpTPLtK)oS#azTHeBGCqsnlj9NCIGNEpJb;iSSJPZ2?lGVE8nj#y*wRnoLNP zUDvlQvp`STbAjrwgsMtnowuaK;8{D_vB36%w zJv*S667QTThf?Cmh=Z!={xFo+ID2<-Vy`H~ArX{AKl+?KW=|8LZO0Np%7v|KE(}&? zkm-iqK;uMF5)cH3KYs+zl0BM%jvE+hMDx-L*xqRy;-OS_rAK2sX;%0n1!Ma{5Lmy9 z^imumWb?xIHBgd8Q<3ZITO&oZe53WDFt~k-gkZB#xr?4x**{ecHCK=){(+%{U)emp7C}WTX-ec@8h(}WY4jqVq71BVnXwP*x&;{_d zN*3_vi&qrs&)e8zxt-odRm_T)R;UhvD$t{UlTf!SlB8E1GF4cNqHtgHu}%8Q8%zI^ zpO2!5*(g*etB5GgYL`Ac=M!b)Xq2bNT3ITjN-o2|WjTohM*|Zlubs@v$LuHc` zZ9L$4X`?POL_=tgyId{qVRj|31h_W~uwSBS8Ah`MRZtYNw3)JW;zH~Pv)aMi=uCgq z#Os}gx^be(^r#pj-M0If8r_YMPZT)4&1&7mrz) zh!z$uE9c|~q;;`W8Ai3H!KF-#GtuGf98}gBI3*2zD4rHswCwmtL-<*{PH$;(Ich%i zT*e+^HTbEiukgv7AMqKZ_!%!^91tMZXJ&a+eBiBB>)uZd6=!3wJGNOlZBqfyTo_(Jq z52h7Y#wYwKScBP<{-&F}%`x@JiQDol9`9Y82JRmh8^6_R_^6I7I(oY45vsM)2Mg0! zNA^4MWmRnm?JM)uuzN;;ogInuA5}Qk;oaQ$cs9Ai)!zvU7TmWOs>`bxrdCQ#mnxk} z5Qpoyg#i0duj8%&Cc)XL_UW9Y?IgF{#`HuraxSoAO7mma*cOEu@T)wAF;<^bOp|dR zADP}}$WhfJnAd^kp5&R5b(nQw_sNEB!jZ-p!ty@M!(=`!YrVm5qzwmXy!+l^Qp||H zv)&M{iBPo$VxFKnW{T}^(SSQhrcO8bGeIkBJ=JR;#?sW8mMt~^yS(gY`@?F17Z%jH zb{eMek^AG53t{vvM+t+R{@qK?fCZn7^EkTA!lZMl?}J59=&K`ZSgNCVJpfBBkb%)0eYGJXVS%p1UU)y*F6#Od-P`RT#1*&Ua*G-rTNAwiZ_43phR z$Tt_#Lfj(r=Zu@nx5yBV zF=8b~y8XrjculznaTL$d_A?<3CJzV%`@=R?nu3qGhpnniU7b64jQx=U%#3e_@5n7P z9CZn~<+hnXIoahha&pWlKH!M&^LRKwKLg-_J)&7>fN$!Zhh*IevmsWNm%}J!& zx5esSGz=)HgFY>*tW#_Bh8hH?clu~3dMZr!u|cf<&P_Ks1R4orwjF4Qmy<{9I7j2^-P1Qe-E$ZHv^Y2|8)>4abo8@^ExNA7B+Oy;0NIqz z!#d;E2rU+kkB0P#KYyn7N;Nuo2k!qQugm($Hr+YiqO^0y2CRX2m^!SZq@xDICbo~5 z6K1##iSi zz-lajV(rBC^a}AEt3AqMcJSKZsorc=(iiiCwip4!9->vgGF5(@L;ix&mq$LxsQ;yn zCD@C_!;8(Kv^6$mb||Lfhhf5I6~WBlJ&cje30%f>NXFsAPq<6#QkQbOXF|Tn)4360 z9ZbI~k=SJ5#>G^Tk#7(x7#q*dL8Sx?4!s4*FGxDT3=jA- zd3uD7(hY0)XnNaS4GSis{9xF|$|=it<}R2GMf5Wql`jRfCIlWupKy@#xLkR# zzy28n_OG7iR%5>`{zXeUk^Xy69o^hb?Ct;Aua~R!?uV|06R7mWI$`-8S=U+5dQNhM z9s#aU873GO#z8Dy7*7=3%%h3V9+Hyn{DMBc>JiWew5`@Gwe3-l_Nq*xKzBH=U3-iE z^S$p)>!sqFt2ukqJ`MWF=P8G0+duu;f17Wc$LD>!z8BIM?+Xa8che3}l(H+vip?rN zmY_r$9RkS~39e{MO_?Yzg1K;KPT?$jv_RTuk&)P+*soxUT1qYm&lKDw?VqTQ%1uUT zmCPM}PwG>IM$|7Qv1``k--JdqO2vCC<1Y(PqH-1)%9q(|e$hwGPd83}5d~GExM|@R zBpbvU{*sds{b~YOaqyS#(!m;7!FP>%-U9*#Xa%fS%Lbx0X!c_gTQ_QIyy)Dc6#Hr4 z2h++MI(zSGDx;h_rrWJ%@OaAd34-iHC9B05u6e0yO^4aUl?u6zeTVJm*kFN~0_QlT zNv9T613ncxsZW(l%w`Lcf8uh@QgOnrm@^!>hcB=(a!3*OzFIV{R;wE73{p_aFYtg2 zzCY5;Ui~l_OVU;KGeSM9-wd66)uL6N3DqJHJ0L6rET&y2=f)>fP6;^5N)R`BXeL+& zo6QZ-BrVcmm1m{!!%^&u^*L!e>>{Tg?Du<%-A6<{O8xZCvmdNv?|;Xmm;55oj300) zByD!GlJZaPau!g@XX#!j!>VHPl5bWf^qk=Z+M%N_!myUu=dg$C;S{|)(pcrOI5b6g zcV*=qSI|KVEI(o_(QiDzss>!+>B>W5IhxlS^Eop*rIB0e3~F_Ry*d7(0zb2SYv%Kb z_K~7;{#bI4uy<>P8(6oG^->yVwA%#Ga{s{Xn{$C^=B;Y4GEp4m=&suBjN6XN-ws|h z6tG__V^Wl+rCfTPUf8trHW>GCue? z58?dkGg|8!;YQ(dl}+2_Im{K0{l$)Ec5rW*Y2Z!w?tGQ@ZkO%A?&@KMXBFF9EHi`i zOwT#+Fz~do?#nt1Hz3;_?3rEQU^K$J2BgxOX2AT>!bmMv8&0nQSVYKW83j(9ZEV#w zjN&G|L)`7uiV;>?**_x)mP$&Zg}sh;>8W-$u!qozJS8IH9zQ1|+90mWT-zni7m2b0$Anx2<6 zpgF=^bxuc|t#XClG*jIl^LA3hx?Z^%49PiWfiUKeVVv(xH_AIRe8-Pl=_1S?FaEF$ zZ!IPxsXgx_Sl%jaPlB<1tvQ^!2ii2R`W@xr@#^kRW!y^B-x4+3`V!9)HHE^F%>IqO zh;0Ul3|&UwF?&L-&5@Spcs2w(uSgY{aIB{MbAqjDb%)nrZUw`=7S+4d)K9AS5NS1B ztX^Dm+m$5hO#;9xtxqoNB6(|gHUyBn4`2C_<%a8abEB~01nwRf!?+T#Big__!bMbF zt|-LS;8LPy3a$3$gAD6^;xulrXsZXjKW-1pFu829!mWo?yqwx&THb1Th-c*q*u2^k zeefe7T+G~7CiS=Z5~B?}bW-J>-WuqL13Xx~@Q^)QhHxDgk+x*nyVFjnX8tR1^Sdl-R(PR#|j?hx!oryI`_wmmB4z4{7wrEBF>sclHoe z2JB6c#_$aL%lp4!UAb@_!sLIi3O&()fDr#T(f=PY@t^ItF#Z^atwL1KN7GYN4G^O3 zHDst`gr4lwxJkr~B*Z2x#CzmkNiiD~)46h}=bA*Cx|c;BZ5Un^r5fs}?6g3Svj=j;fV|OR^i@=cCh)VMW_5+L*;k;r!;9t>|w{@)`;;)E->kUinNJ?X8kN! z8`}GhsA>#DPeGkd8dg4r`L zyS19T8YH@ihS=4~WrkUhg$=sYId}&g^9vO>KCnTIzZ66a=?JDsc*B=vngxfB?;*qV zL|Xu(P(H={Trz4ndsE#KyKv}^sWN(EEpcsO6`4%x-hL6fp-yZ@=m!LME{*J|u;(PU zhn!*SVlA=jA^0#&C;}}4DRC|Tk)2eG1v`?uIH(hb7|mL7IBeI~W6fP_36}|0t9q!} z@!h`tf|zFCFY8G0K$!&iwF*jOb@C9E-u5s?^Rlaad%bCX{YDpPTBm z829R2aPrE$*^pP7-pjT|pATPS5NnI|WwT++-L34$e1-}4%*dsYYnu}Hm#92MgFE{o~NjJ{EMM1=Mai)NW%TmhhCo7lUYkk_3rXFLXs;*u? zgRA~x>&_K>WvT0`Pd9_t44Z?otM8lH}ukI$yM3RtOb}S@I`i-+*_MWx=B>k@KtGEN8>e7{~g_4w!LHb-T8%?i{F01C+zU_~n>ZWyA#$r92il-{03qE7w z=Cpz1(vmmZVhNpscjG0M0K4$Tenmdqi6Sa_1=KMJKbaxz-TB2#j| z6%G1&3`Cs*FXeBf5(kCLyAWQvCo0ZsL(P{pXxPqF2l6D7M->xL%)qCYEkc|mAi<}j zM!2f7X2*gpVHIkatPI>>9cVyXLNiS%vFL9?smnYBm z(8k{xAaDSFG3*O+n{p-<+h z7l32L?Kv`Udr$(2lSmFBW$yYNd>T2?L+3N;I5dSOJ3s}q5#UX0X^z@DgEB$HV&10A zh$rhWVb)Pj!doaXx0#;$Bcn=|-z~XKopH&SA^!)ZkvcurJVErdUW4&BwdCV8j+VY$ zciQn&1L7%B8%%^|UFw={uTc`symy1L3LMfFY3N*^yU?cSJQCgLc%}394vUB-)Itp( z))pWllOb*Nj8O0}RkoI!FBX!U4yC?kPD@vFu|>qeg`S&VXlPQMy2}GEa<|}5e#^L&lXX^D1U!rce9c0+G>TC7~L+bTW5AF8gv#eYG z_;WNQQpE>x&kqA*?^}TS2B(=Mr5>Ase_e4xngO--eRT4DtMq`h?QLjn;YW)HTixlc zpnP+~DkXWgh7H1Lu2wUeE>u&y<%4N*+>;F)+x=UWvKjon(XuB@r$%7Jb7cQh^@qdO zM9XJ}Xo(M1KWX8xU^Y0d(B!s?4bx`v-M6p0@$DZP?GrT3lb%%H>>?4TX%etz)cC`dOmZ__G2X+AGcJoGFy@wtQ zeakz$cBhhehjg_(SuL#qVk-xYE(aUTzIG8AK3XD0mZM0EJ13YVzUS$oZg^^hO{b+^ zWy#6}LqU}|3q#lZqO#g=>*2Az7iHbW68sdBHa@f4CwB*}eQsFu7Tt1TJhp;6vXBue z4Z&aWG#~BbN)h`=E<(Vw-4-1?9pAqoG$@yitG#M$ z{V)~zAZdJ9n{7$_oi$!R(XyIv*uawdn?iLi0_|*UpE{z}H(+r#IfP9?u^% z!kKxcc+??s1pNs5YaXS!5+zbthP-;O;!^z!rLXWNUgHa3&8% zFnn7A;Y{bf;(_n0W1vs@RX}8v>GhLDF1~V3{R_i?vJdlO68|#BgDk4eW|fA=Px|8~ zxE(@omgp2MOi2Be%RhF!?{Ga)FTRJW;ECWYF+u9F?c_jdOf1i1BmIzVaa^@Hjh%Dc z?F+^by1;e_#f|(klA^TO3A`*eE5&0ZPj%0yYALQ9XCW@RI&St+OHRvu1>@Onb5fQeP=E$YVLhC zMpkEIz*}74t>;PK?7p#~Z%%f?7~v`0DRg{|bgVzLd*4!|S_D~Bs^i}}-~bm7W%PuM#$_t2fExWw_|WAamWxY6S=i?9Vv z%r%BcXG@HRZ58<(=pqR3&TX^GGZa(U>rmsz|48$YB!5Mbd}P5~h{T9z78BD2Hc~3x zKc=D%SQ$%P6OieeGg?oR7gqz4+_JkSUx-yl&y1FKX^s)nU<6PVuXc@ z5Q^F76 z{SeBk&t7-TvH9etn33qag}(s;Y#{$}DuS}%Dsh-D+#S{21Xu}Sk&DG)xHL^Qw|H>V zxET9a!QifM%L2`JPex5!_AtdT_*%k`VeIDQ?HT<-M)oaKV}&lR%R{pCedOz43WD^xnWfcqCkBF@ z9VL7YK`@>c7LO}V=2TqML`PYb>%P~dvj3iOGBECvD{|;Qxf^$-ay$lo8O#nsR?je@BD*SU*98?E={03WiP!k{}RCQ9m z$}#Jzcn)I25#^-Qz>JN^??=RtAucr-Jg~DzhqOS$;j`Nvn04M4em6Ki1o7#9mexRO za1Xpdyz4D?3QY~9CFGp2%?f=2jo6e$v!*L(L}2VrIGXj$Qo`z2<~wn>{lP=(&WO_z z%zI*bMxNYxqS^^Q%LdYtVK#tB?aiXO4M+CB7<&gG$J=dtc-o$}ZB5&@ZQGo-ZTIxF z?P=S#ZQHi><-O-zocEspSGOvuN>x%xCBL0#@4fcgYaPtE*C$-&zfn?1nvHwV@O&dC zG^{=q@PJg5&e5rlee5d-ODOnh6pYWDcTevPVX6aF32}|q?MUjK+zG*Eg8hu>!3>vD z#6To(MH{H&m`%fZA$a*i0#{J?r7@@lM+hFZ z&ZkBG^|Djlz`YH*w<4v~Wf(c9SiXfhK0TTB7=G%_h5B*3VY-{Mr(#39NsH^FNsIi; zbfxqAyrNQ|a#A0m7Atn+lg=3qU>Le0FJVKJVZ-!!H%^eg-}|c|9)H>y68Q0=*0_Oz zj);+PpOgpiW3pf$Q<5JIr*HEOxnn!+l4z9__M2)HZ8Z$+XX;AZ4 zbHeS12|r^f>l}=2^&)K!_^^W_D)E)M=1IgV!9z8LAPB%sc zPfA)!?gE~CA`W;t+Fw9h{?f;&?A$Tm_@-u*b8N8WiLs=eDGS`on6oyWd#S{1$L757 zf)WBI4i03wm3IuvA1X3b{AIQi7$I~~>(GGoK=za2_GL#OaF;LQ)qCcH`vjYBzK~$= z8Pz)i^xaU&JmDzMok`x+%n?!0bCdjZ7)(3Fx`LMX5b=Ibd#gKQjek*#?H^z|(iG`& z9gfD8eco3tfy*L+vcV~ap1Wq!*0z%Hr2o#6Y1i(hACyJEoZ%`KXD;~_i{W%q#4i83 zNI?4S=5i6y2*l~+n+CW+ns$7A_VjHX|CNRQ!j z?mg!Xz92QTb1GkuDZB%`Ugcs$*t+rVsyBSZyZmjMjM6`7R3Z4AAoM>m8iOks(K^CE z2|I$r-a!i#g9|>xP%+Ij4TnV(BTI z%%kwU#e70lAB%7oi6%RK1w3x$KI+NOzoSF9bqOASP4WW^GZCQ)^?byH4anaRnL@(UWICDLm4gkT$mXtQj? z4&JyPx>?hI@@x9bW99~*U4rvV%vUPiou`~wf*g`5pYaj*zF45+jx1~xBwpaH2WD@5mYxd=2TkSejx!w1-_NboC`d9<2=P#gtojMh|)3>Vrr9TAr?Hm5TN7$r)n*A3aKREvF=d3)+P*?I0RTaaaopcIv zCbWoJ$WI2c5MwArd?-`0w~B=HN-2w6l<2Pr-(akPe*AZk_xz}%MmQw(x?foUsRWMf zJ1XDL&sVr@1i5(eZByW6J8J*6VlsumAHq6eT!QO~b_4=()B0htMc}TO%TRr*Onr>& zN3b=g5*I1DHlE#>wK{#fRYiTguA3#^@v^LKjepXHN{t}7*rQsC27_|v8*p`IaGmuX z4)XJ3MAsEs8!H`)1`t?mGIQlGvP$rk2b5`aPFi9NPH5ufv2I6%7dl|6zbj|^X@GA0!QGH3UbZXEjmCk}Q%Lg&3;i2r(tBoCGQEA*(s}-*YDPP}>x(et$5< z;;{)ap336H;$!SzR{XU7E-a0OiSs8;P*ad8+OwH%M*s_6K|DW9OpqIG7wP~ild*5` z>;31enRY&K(gFu8wkD`r=)Cx6hSBP#xcZ-g z9PRpS)ZLwdIlXYoNwE&6U}*0TsOg-O6_mXKU(t+v*hLA`5l+D%AAZG8D6(W9g4@J$ zNLKMmV#!-Z!(}o_M2@N3_V6SKZW(!t%w<7B{Z7~vjTbJW?6~(3bMKI4#%53`li4a- zzdA>|B-utDJ47y^XO(Z0FWU+5F^FZ0KMH1lbV?kC@l zqxh3u&D6Dm)u42V#Ww=Se3o&t;I{?W3O9+e8pSl{rQB%RlV@RPEjfc{SttrHXQhHU zQ9IVJcOU;Al9mLPzv_ViLRTQ)zOn!Nkd!xYG8b@kG_f(XHgO=4{%K@jEezO{aj-CS zcCz^SPr75GqLvgkfRa0Dy0PF?X5Y}bs#WhEW_7l@t0g6X1WH&RjE3(;A^n?Bwsi$A zUMBKOvPb?pm#-UNg_|j4wiv-{Io0uv)^T~P3*Gly`#>4TxPApByqwJaIL?%J`@I6$ zvkl8|ta3K})^S8Ok*Y>}71E2(dMUNc^{o+0@i_u3R_bLxF3oCql&{6il@zWo;>*pZ zK7r?iu;rjTzH;epY*5GP{f)%Ti1ppC?Zw(gk{`^XG7wf+o4<*0Ln7$&bmN$UJf}R=2)McW#-0yqN(irp^RcznCL%+t)Q#RU zvzFgw@7(Yy@tbqopkDeCMy z+K%eiJz<$w0gHa z^rgk!yvUb3pmqHw^GWirm*^1iLV(`M=LOh}qyV;=VBq!HXz41onlee>Ot*=BUml%`T?f7 zSPSc!SIiZ&L&5Is?qluXVd-pPVCnNPYHbV9&amg@a?}v;dJXYWnnH0d`=yZsR7PLA zeJwoVpuORc{9rgBZ)a@l^B7(dKJZ#X45l@O9!)w_U6sHp(#K|$#2A|{5=cfAo0fE< zt2mv7qpgaNMsZN$;Hl{$KuW zuu{$B*xJT0Sj<{tF*j4Q@3XXfVcui+bXSvRZE{BGYg)fFAvmxo;_7rw)A7AM+-}F( zy9yPIW}@Dyn4t9!*I*Q_u;?B0StPDYNk6@{Z{aAuHrT96UAaE%%i(!PAiI{aZpHEd zb!(kKIL_;=5KVhMx0lHK1=!uRKJ_AD5(MOIcRw&)U?rD~km!(RtA`M=;ur6vQ$-!dK`hH3gHeoUCb zLuwpr*G4`Nbymsjnf%cah!P!2C5-*}3|ui+_7z7O4TLF-=&&6oqxRN=iynr8%Xd@m zgRoZ^pvEEt%(<7Y>qCm@%LpSaboV=wSl%IBnYke{)mkwJ+y;Ie!fExziX4$YQ(}&o zKc|+9-Z;W_A)F*P=WoArRoT_tP@{G&(g$j6p04i`Q~BiYG(BfVY*{^nd=~G>J=X=$ z!Y`9em<&z`E;>X9zgjwVw|-j!go!Kjr5K599nX3&Myph zV4X=emYk1nly0fmao+HR_ncaXxJ%?_{`Vqx{xJvv9KJF><9W{hd}tm2fVr+;xg zNZkAl?CPi#PNI^p+AMQ7*87)3f~R#P4*uS0M+WNTjxyY6S=K3O48tTpzMvZdeqO!?c%hzi9aa;89nCmI~`9+ z#?PWzmHH)w(ZUc*$f<&mITm5s5SQG_VZ9lw?-xXkib4=-ny8_BV(d<#?8^4_A(N3i zZ>>X*CxcHX9<%a$^2X>xYKj{>m*Q|bTn~002shz1=9K}=II11Y4qp&f z-4TJzl96E{yc>xB*mK29dX0nZy4ja>YXjIXaAQZ2OS}DDyaTk)ZEbT44z_u9osoeP zp4}P>;o!8)!zBEZr;WV>i70Oq>y;Ct)Xk2(DY9Sk9hPa~E5z&tR_U|Sdp+77M-0N~ z(zq6|lKjIPrt^v66VihrH1=8;;w5zmxF(~pJ&cqtEspaQ@rUQ}+CC}#FJ37d%BD)E zcWYFT*oRF4_KtYltBTzXINe=cW;sTsx%v#^y}GQgAm7HzTp0WZ?&5j%9+j%$mlK5N z+7cQUkKrMq7D9=h?m}KpoK?(I7#_8OKDbzNOiT=^6npcig81dV`pscUxeY7$ECU>C zdv<@7Dnn*nq8mDm9ao9%FVZYzQL?!kW7NPZg0$Ai#!M&fg9^^V;comJBdTx#QE5>^1>MRgk&)Qw%qgRZahaBS5H(Gw{7(6 zZ_BpE9^+fT0h>!a0HsX&f1fLr+yTqPHh|S)fYPRug^8oMfh|C$^S{J0wUo3}P(E2D z*a>k)JDA0_3L1j66zRlC>#0ykP=QGy3w2KkGsr?i9Ct?~fPOx_YU<&bod*8=KFK~g zpG-d-<^3d9vL#Ejzc^}K`?zZ5?RnAA)vzS{`T7>i2h<++)BAX!Ab=A8l>Vg8S(-ZK zriVEC=Sz;hsw|OWTkf_Em?QL|w|Q>?x&jBScn!sX48HOY3Ab{@F}ET_YW2k3r1kwj z=vKVzgKdiK-ZTlb=2C$qf$)w1FD- zG!1zxAsOh=w&WJZpdm*;xDX|mS4Ab^ZPqk7E7o$CZ3kzX&}<@+ho+h8(j=NDP*#y! zl}=FE@hJ+d)N?V33qv8G=gN%=1n)G{&e}spjE+~6{JLPV8Rj&Kwuz+aYbJ?(jSW1= zD~oXZ7*8BG=3Ftw>yTGyHk?K|G}X7}_r5DQ4~qE5{Qe-0v9*dJjps|`9o4Xv5prJz zjuz>stxJ+t#p_F^<#;$jdSbvfIHB0{Wc$EB%0B=i2dsJ9v<&*eF%TPA$}XBlotQa# z@1}I7BsT1M_=jZ`DRWaKmo|r?gKEY;r7kc^Tow{k8iHtVDMUi~R~9L2inf;#`4>P7 z4cb;IIQU=g^(WWk^ObLgNl zKz1n+r&t4~L}pwfzDEq!7y*j|rh)pDTedv-olf*HEGH*G2Ni!088v&C2{n7qKZ5SM zFrZ4=EBYrWxZI{9Fim2zIzLTew2duF74_OX>zTYekn!1=BXkCbOX6dqu-h&rHF4mG zleD22@WPW}&Zsg8i?%;q<67Od?hsXq8yD~bKM}ZrgqmXZ$@j6o|ORnHVEE*1^`{A@7@NZ(NEQuZ9+LKlUc7=nt$YA|< z>{IxRe#wy@_(L!m3q4a+zu-X*NHqmgtYJzZHr$Oy{8^QC) z50zi~J|lcz(s+oYiIK+=+8F0u&xbjgyZ0>eHhZA4# z^~`jO64}3%RG{^qazK+=mPd5j;>eD9&h6gPA%dyz6a0q)2zE_42d*)eUczhAA z0}VI(?-TnqiLkFDdiWY=M`mI5pd2v@*yJ<@NOcj2%k{hj`S6$z5T6DwU{%{{QHK)R zhV{HoNT~a?2KNZAsjEUx$SYzVHti9~*Nl`4c7fDlC!`JaG4}VnX4*YgKZ5bM9GB>& z=oNm*_P8dlHh2N)6+MdTdfw^%YcDVkrz;u<04iPp{lNcYJM*6lZ$dw9O)bov9Sr`v z6^xFzkwX?h82VZ}S`6e3@XO01x**KR*=B-*S7A_rMHTlFs`9^DPQYnW2$4i%l^2~etVmm())IJO%W=UGNR8Ki4z5TY0oz_!Oiy6;@&+W zh!ttUZ9M&G!*_kI%2urtYEW%&?!yQ-1RYf|@lXUCy!je&q6J%6Tx7&)lP|$iMDx_a z6bKTMyQzHFouQ|0?GlSIt9QOInT6K6G$2YAf!+HQg?nT$@;k*^U&xyU)%m< zT86xNahaNFGgtSbL4w@lf59}5Rk_5vn$@yZ6E&6P?q%&hD7&wwbCkbv=|N^jxbC$E zy-3^ME?+V7bL!1Osm7xwv@WSoVP=l1XpgqC6KsYL;V1PC3(Bu0`Q1O`(IG%^BAe_F*?NhUoO-*WXVa@N^gy4X-xR}c!chjE zFLLQ1^-wxVyg2Sb^fR*0=`&p@riNqB_`2^E&q3`w64(V8qm&FXKG8<$;&DZPTZ2JG zI3!T&C*(0i$*V?!E0{)c_n~T|CS&Zo)0Fs%9iFXJCm>`*#+&WhYa{QHp2pnRdcT6E zIwokRWD-nF*!9}YlagJF!)%S(;j*C+*kc+iLNN;Lp#mNih+=iXLw?b}?`lc@Du89o z2W_bUml!2*EJ(cqQA8k!m;6-@Tbl#gk`F#IN)Rh?R{$@r;3rKfpvXAvNGh%Z_xra% zl0@AsL;(rErR1-ASVgsfV*s83TPvHkIsdnIsam)vGN99~i2LEL0XvLQ%@F<#MDRC*Yx8duY^C*Ac^YiXxj_vn zE6?z9)H2jWw8d9SMO zRug*0n$k0SWFl-QFoHi!@s=25yOsg(_^}6lXp&&h67^HUoMSy55AXB>3-b~e2Lm7T z6k84s?vF=Eh#0Bxt88h}!emBT_NlbipR8<70t1PrI66(sP0l}ul4(JURDP90CwTCJ zEKJVk&&8oFtr4lb9_C&{mppqXaXwIGgC0tICp$g4S(?J|Mc}fuDWU>QG&K5s` zwfEX)qZ{OR*wl(*_c$wC=2EAkcL>J zOzQ6v&DOXgA({9P2@hFI%(H6SS@V=SB$t8Go~xi`N7b=}V+?<=*61G^jrDRMVvL&{2Kt1HG`xE&};wS7R+3+$S{@>6GvAV{oB>Ie9xG(#lfPUS1{ zpgd+wnmsq{`Z8xI$B%7}7A8IO(4{4~i;)T9$fV$y49-wvhFaEO?h~gtn5PFY6j-E8 zN-b&7VlHqLA=g9)c_k$pKo(Ic9Gt(H=B-EL!3}ui!plmSD)IN7es;>&o?n0v{*ccp zVji=?&=BELQTsuN_~v^{SOB#(5{_Jh+>{iDuSl1yLVGlJ#t0jEt_1Tz-}6M zV>JU;9@C_1s-;b2)H2?Z(zQmkOWk2?bk%YREWjH*#Oaq zN=D)wk^9AOEd?b=Elj=M*DoE${eUJ>(tgW*o7z6YCe_xo0On4a(vOHVce)$;@@*6C z{7-Frx8j7Rd(4RndMJsZKjvWEoDze=Y(Ib4#+bqp-G!hoOe&sO7p9fy!^zqSLGN%u zcSc^-^j;~gwTzuATw}GX_8_)v_9)y_xus0t4x|L&Z-*9;pHVK*HWX7f$6!N46MXsf zrbAS8zhatkpM_@^(iR0{0GM z`u-bJhS&Rdz_Lw(g9ajnt?UdFF9S<7CgNNLPKh2RhM68fNu;aiC+d5QS{DTA)~vP4 z+jvb+5z6@P{DhaiN1^_-(a8j%+?o-Oul%*xJ7o|b^)n2)2$~V$yGqa2^%KHp?soQb za*z;+s4|JyeUz8NyV1#X566=lFxRFM(k+tGxa?9wv1*jQkxwar2#HP(d0`pat8~gwMz^Tm)P)uU*ApDqr3N1AF0eE z^|F2Xh$^#e*G1yE8>(Ksw?Ew6xtbj+=u7EGsA=D zK}@usV}ZMaM`L=r%1lSN;eAX#0+iRPAV-~J0yKLJd@8yZCt?DMhJZtp-x)QX;fGx? zgSH-o5*^_US%o|ehv5K(FDQQf`^G&ed*~F5IZAZDTS}d~l_IMXx-g1#NnK-IPK+3B z27^2bbai@XCedmA8(&N#?FqpMn7J9Pt|;*i4QacHS~Yi8dw@8%J(vs><1X+d`ERuv zBA--t6Xq$SLUmEq8|K&rllt-eg-tD^tA_B7hR02w$IT9ulwP(L0s3!UINhgTA+Yw?z z7T3gyI8CBD)yu+Vp-~aeuN#Y^HM)RI5YhTiOSG2(a$awFgYBP6)VM#Dl20Xu0rIwK ziMhTWQ<-Ti0!-NWjdy0gHWNJO_VnlM6asw(j-7KH`1^Map+(%GftNd!(p(H9aWev) z;{_ET-JkqodBK&h+l6Uve1bLO1{|aW#Fw>lEl_CwG4X;@K_reuU_>P8MRkm+HuCbo zw%^!qPGE-Zw{zlscH9J^~1gX)JxC0_|OvLahi!`09# zPC-padbs735gF_=UIy+&asa9&5>|cWc~wCrQ34 zL<|`1_w1?5Xe@`2hkqrI$6Qp>{B?_=Y3Gb)B8sU9dd>-3EXVFZX%I-VMBX_3%$c(h z1<`J2)3TMp$$Av7pIF#9JWd+cP4b=d{o6!xFL+uH4^RXFB)9)Vxc(nzA~gSW2%-58 zXAe8T{D;==zkm#CiqR=a8CuFl89GVn5s3wv$&r03stM|mahV3Nzu_c+cl|F<6Tqh3 ze|Vbw<0I&dtS$bR0m-l7`y_5a+o1%QkN!=w?XQ;$82)8FV&o+B)5ZpXrbt`ZngH4l z7XZHUpSVh*@;~+EVIrv;!)z+Hrr{6roz{3$1;rs}%mqskXZwdtFqdrflVOGOeS5d^ z=$L2v@wa0cH#L6AC)M8@9Bp!VUbQ$LZf@}T`hJ4jg%N{5ogXi=AoRol;Z7w!3A%IO zy5oZ3iiEfgJZNi}gdN@%!D?lHkokXhlod#;>^}Ih6Pkg%v#Yd@cbB#exhO6 z4luCN?H=#hf?z=DI8I2!ET;@UfYij_KefFYqQtCxc?@o zV-gZ^{UlSS!fBYlx6*i}CgB%6-a;gln#g65Xv5MFWmRqd_9h^U;%XiZp^rsfPc{Uk zE)sFRAtj#nBY(0&AuI1qRF$~x1tu;QJuC}FlGr?0(LQK-6Y}P24w~9nz#Xc5&WE^I z8RJNnit=aXW_5R)oLo?zlAB*>LfK>-6gw;V5ylW-+92PbXYzfkAnt)Wevgo>n&bgh z{ieUqMR(i>>7@Y(-w{Ckh3kJu?tg~jf8%@q@1U$u)l$O-fPJ!z2Kp%u;RUFAE@yvKn$i9>s2DIGS z#9UF%*04s%T3#=P2zrv&glu6DeJR~)8Ow)bF=16LpOs;uM0gCa1O(gy4RdSVB{E6S3nEDGi3;Z8lZ zGKJ?j4BC z($jRwW+Y;dbrw|XBQyK!&nhIfW7s&S_qQRaxWxe-BFp2q2) zEZu*zYF1AEwk0CAs9BZ<>cfS{S~4yXqF#{}-B_dwcP>nd%E~KoUhXHI-O}$ zEGe^!PAkz&f}vcdPUp4BV%#vG5&~1O4ul|P4Xp7H-V+%jSXfm#L_cC~jod&#Dt2*j zuXK(4(@qZvrMwc*5!-TmAF~zHe!Z_I*AtGs;5) zw(#q;R<|RO6J3`Lz?ZW{TkyoHQYi0|)!lD2ZV#6TshM*D2-#v{)}C}9`d2Qu93lmOV5L4vx{4Q0ICPYry1b1tj<;K8Omjzb->QuMN@!UEn!1ce+E0}!1YSW zbM7_?p@-XSs{BT~2TcI!#oYX6ZI!*pHPRmVk~D)Q@n+G51@r!WtJ1f}pRb8}nrt5j zbaC%H_~M>$#CLF4T@N_H9Ono>*|{sm-u*b@6bnr&B0D*QS2GeeNn{Ga)hKxQ-@BV% zL{}j7M@H*afrJpV3?Z1TmAFEt&xlq|&E40)om#yG2srlitvHZiKD}-k!!<@xZ#8#J zf5L7G&G2;%X2(HvMZQ88q9jDqn;6E`UK1V=$~?P3tr+zV5UUdk zM~2PN$sYHr_p;=HMa_lk17Ee=9IV|OoH*Wsu${TrHVWV9{9N*PObT}loCLPF-6dx8 zZ5o{2rLR}Q}fz$WzgP_{>Oi46e_mf|o4Rmp~NNgp8o1MY-kQFu7!Cn{9h zJaS}6n0Xzv-JeW#FDNpEcoz`nnamhdf`L683|*HJet*iL4^Nq#C$&BJL&Ds=q)Qv2 zKH2T<4=kA^Z|cjU9Yc;rp2R~TDrjNnxN>)8%gx&B*m4O_fStb`WUJyMg)4lEr;01Q{bcWr{Gl}bjn}L);q6AY3m%9a1WZmit!a}~j00l3pZd|WSgaK}kF*)C|-dzoq+|aaJ8lG47Y%_vodoq6h&lB4b?DQ(fqjEll&gs zzRQxkJX0~@fOAKVvEdb+v}MKvN_(qPJ!tG=GQBG3(if(8!euuQ?Inu3Zbdnr-(250 zjYbfeCjDZi+~kH82b-l@PkB8}a!B>NoqE63KIG7V=k4F517WZRZ3_Vv;sMAdBlm|{cB zmBZP$k6UE76Rj~ReDk6piPV$(@X*P7x%<%ikC^h|T9agHa^y^&GM=`rOCQgDzR%AG zwr_NMYZQ$Jk^|TZ^#-LNS_~WhnC+B>8ZXUweK@xLcE~?RhSmVolpG^n5mgb|h{;n* z!a~=Agyh)(FAT)>m~EXBW@7b((g1F&5ix}UT+~M31*#;tGI_;m78k9qGBYZZzH#Y@ z+vKqB~xJB{cRj}qZ{ zxaihBN_WO2K?*tw z_GQS`+Pl>DiX-W`ku*`$eogIpm==b70X{K5cKb91tcQsV(Ym{a zIBaNEFBKtlIaWKd*)zLa-)9Fm4hxm@a&|NE$0yM8@8VThk3zMLXgdMAn))bkYc)b( zOVBP>%cS^}B`sw;c$Z~vIXgU2mTvg?6vwvKaS`w=UO}-d(`jc6`TdvVn#_8Ac;^e( zP`nG(a+29Qjx8SnyoZ)NC)nqExUNbQJrxR1f60w+ zp{>;R#hsw8Pexjd5ugex)u~O^iuI%m2=v=s(WA9iK6SRy;LYET3AM&XzC~eCu}giN zD-+&auW~{o63R2u05Z?6VqydvqrSBp01J1w0rY?jX;TQ9#x)m zE;aAxnI(&&AADdGc=@Gm&BP!qMV1uFD^5+bzM)*mAxM5ivB)7*TFl=w5<$~m>4}C0 zgaRm%rPp58+z&8L6!I0T&Cwx7{9mfW=T;V1u>XQmsg#%Lc z;xmRA44>^QWAPH5?qCq%vBh?fLVmn$ER@aPrO$8Ldlpz0MAaWuUo#W^0jRJKFPNJp4kHV#=~gQ$tmpxs>{- zSU&I;<7HEpUJ?vq zWYoEZ$kR7j22Y*&LX(otkQOKGqWQ!aJAxjz2-7YvwR%HRoxJkB$fI{-5U%WPkl|<6 z%-7CRei$ghZ8LmMgKA+KAh$K2nc%xr^Lws@3z)ivxp#`Dm_55fnb}A0rw)Lv6MhYM7m7u& z{HpOckMHzw^?c}DUWb2s6oTPnlKIfK%+lumwT=_tHbd0nZR;QrDK@wvF316)DxjGHa4LmsS(x z7PxE9#8qua0gxnEKbN6N4oy86VznEk z3auiAy2y-PZa)?UR6O_%s@JzI5HlzFRQva%sMuX0_Dcz96sh!H`n~KrPnRbzGuOH{ zj;>Fyx9eAFi0w4^x->;>;)4gDKTG-SPH_Eyr@%`Debq+oftje8q&^+rpA&vc3N(^Kw`TC}f zsu90nXQTd5iZarnLqlssv%g}ne-GWgH-)E(m5^~Kft6`ZVle5G{+U)<2_?>0zuNAN zN-5Lpv68MCzcm`yUVcD?IVazs-L5@*bncGH`m&uAjU%UxiRaC+QA=JVDJX?*ve4OK zgN%Ot3kdei>~<%!FH&P*#{>O9DvB-;)?agyAq>-dY?vyZswyRhF&!ui56UMaep{%_ zPYj8SfmC0!7Z#7niNhq&V0elya@pT%7@{m!Y zC6b|*=25(DOij`(_^I)1FZ1j~Io~HK$%N!ieu-C=Q))PVS(k`+14ow<=XUVfwr2=% zB~7Mkrn@%&QBb2^y;6eBIz`o;XlH-;R6Fe@7Z5@JIM6!g>GtB~oep#C8#uzAIAdLv zncI|6h7RHFLxl}?-T4&vL|?VAIpk~%<9r0wO%i|@;S?8pWRH#X8<;UB!t6tBoe=%- z19uA}3&`Gn1(tiJKGlBqe|`DPzP=Jr{~q^;aM)$0xemfUb?u_34F@`2{B%o=^#Z4P z_sH*@LvsbDzRm=6nR+ZU$9u+~3rbszt)-_0yT66vm;$&Nswp=A9!*DD$^5-Qe_;H( zQRPwSiXc?8-8b5t*zJ@7u!>?1biw6O%dTJsKNw+h3XqBW-BXegmAoZxB9E}%C4O>4 z3?N_20R-}n2<3Z@b^Umh~RmMa7FH?noe**o-zw#etr{h2V zjTMPDa&v$sj;|){vtw{suU0n~rPQU7a7_|SOPZ;2O$6NyPiNVa=Md1e^jRkeZ*gf6f)OwXv}KCtC5cc9z14jHt^qH4;Dsi@6t z?4T153(|=$RNUN4KcBRwV8NJ!#p?OXvtN=nFOueIEB1EkWwZ6_qlD~94cygpAqj^L zPhvm?oW2})CnbL5pc*wH6YPbGNgBrlDzI_qXJqR~cU%R->H!m7xqV}{!OioA02{lz8s?u?+574{ zD$*AQuj7TYuUv!Oisz~mmw`g;ahkJFSpv7jwzWq>e19s*`+;%6#;@vg%HOX!!@R^} z-z?xIl+4FZtl=YUy#y?imB9k<@q{B(7pI3#r&EG~S47t?DRw~-B$39BIl|*0TZQxQ z6&3Nh%3=3O*CQAbz6%kKmHc7|sYBdDtjIa0@Dh7%$@LYLG+ll=`BseyEM>Fwy&3_i z&?$x_c>k^$Blk*_#p<`Emx$Wn64j_DnQS^#%xL zXP8OKi5+7zifwuVfWm6(#G%b0LJoH9BufPg8@FVEHC1o`Kiv(6CB>YVQs|rG&tcy6 zxAs+N2JP?^kcqqiMk3t*zwPTkGm)T)=}!lMr^vreMK(&vYA8OowRZM(=HhUPjmzSJ z{JM|=W&8**h`*4+Z4y|Qn`G4I7L1oxtV?}!`EtK{C+h=~N*=Y$UJJkS`SRu*U5y~g zs(bAJ=v|JrOz|AGOl5gKem-3Nr2AH2uQ#YMo|$K=D~jQWgNccRX7XcO^P5!jE4NO70(-2!ahH^QNK0Pt^!wpt#Q_FOL(X=+KK1_pU%X!H( zXE7R;5v0*nlZMs`&DIpQ=-)YG2)Z+u=}C=$w4B?fDOkK2DX>FwHC9SBtE@oN??^B& zPQzreDDe5)!sgu3LImb0mP<{J@K;(b?7SxF_hUBH>&@efkT zxlh+yaWO6XQ*h3tAQf$dYKO>nQiN>q40#T=C-8kd8PD7#eUA%_N|MMhb*Jsxxs^n zlT9f344}R2J{rAH{a|^T^eT=rB?L}oj5=Z3yevC6k)Y{yn zfWXX#-ILE&zRb%(UI@_+T404C>bkea_81=5-*Zi(e2nxmfj-gSJK*Q$Eyv-+=@M?a zujYB;WgMG^pTb4eszlYWkSudDS_f`Ma)f@GB&$buhCoRp*)XK##lZue6NG@`dME5l z7-A_RkZ82JH*;5r&pV3Ixa6pI+4Z4i(lemXLiaI9oidp@jm$_z(e4=?d1~8xX%B?X zSN(D^JK^xk`k`<-M0%sG%b%e;KzWLYm~ES_WK?GUxCT} zWadInK;B#gOi)DsFK395fuo6pt)q#pqlFW|phyX@U1n-|JBf z^N1EZ3T&Vs;c`5a$I*21{QL=DuM^mOyWcP7w|^9;qFY`}5$AW6=JNc~{6G1VzicJc zLTo~WTO1~Tox2J3RL>+^0gLg-$&Jv64axQ^ zw;ictI{C7BPlmQ-N@&WA-ew8aXJ|)&fMUma>27Fo`AA4i9YjnsDAUfhxU_T6hv0n{ zYm_XIH_Uc^(4fV$r>gnD&eeJ%ZsI_E;1A9fV?x%NyhqZv$RY9qYYH)9aMLY)z6-rD zfo1I&Woz6i41}GfQY+?#>IV2B*g{_cCSy;B^IN;p`^L}tY378O2P^RklW3bfMvu*T z{4h4fj^16x7UD$X-fkLXv1)0YKEvUy0>+wf8eHblRf#)lyA@}wXbK{L+8eUnDE;eGtFD4VRGiXwvp>s`sE!NUAgZwcS zEnjdq9WQOSLCKc{TPKyv$CF;~^Cr2iDn69ezT-f;2XRWLIDgwp8rd9O4$O;+y7D3{UhfoIT<*a{G-0xP`7eJIY9O4GLF|E0|^QK=C4|m z_RH829w>6Uo-nTtaK9npM@a26ENIUlK{MeO|XZ z?_n`d?(5P0mD~GuE4zZn%+v*-4_h71_jZ&HSchBhbbOn<9Qexe1>)!0OsoNOt;``M z%ttmtlEx%dkCM2(b=S4l#nILNBPW3YZzR}@h`F>~3=8JUa34(HsqRm=GbZiSB)!|! zyXHyar84N@#S`UeV%_J>*y;cCcBIJ|u<2&ddlhoSGq|qjf3*kE{x07e`~1v~&quI_ zftPS?gy~$}`wZnv?(R+zm3{kUfEl}OCjE8?{SN#j^-NmkuH0J%Sb&r-2axg){j9JL z!-C?2R+58rZK^CzUE~BEaW)XmFY3*B5_yusUl?6+9;; zdWSaHSFjvlg)j2<*`HVs_%Rq-+K!U-u)xH)zP<&S#?*s9T^ib77Vpg0>wF$|f=PGG z(Ze-KZ3}wa-1uA-mAPW>N|QM~N~R{)0+WhHcdwSWpF2BiInqp) zLyzGuTzCs$Qc2L&pV;Wu9*FP`BS6K%@NaK@!JlYkv~Ec4{3f<(ufLn^8AH?MbYB_u z)`v2r&<9Z+jX7b%$T&Q^HP>V}hknda>w#;I%OwY091pEsYi!70H+wz?;FGyxJ*w7f zcDODS%i*z<$AV1(0;aKpuPG#_ZCy78o+1G#hP;E z_UhUUZ|OI#k)E>FKOXw?ZwN)6JbqU=WomvLcNOgvZK104BJ3@Xiw-$pyIcUtZ7N=8 zeF#jP2V={d#f-$7kFCQa&g_{rCVCH2A>pdnsY&x-^`P9f20Ei3U%ZaAir8=ka%Jut zNm>_)Q!oo=J39PL5LkBDjNqaGo!-;8X|t8dlx1eojJD7cWBSvy4gIMY?xCid(}g9f z>-%EpRvQ|g>{R08PlY9kI*H4eK@%E0Z9d#(K|1M>ykaXK0$8KnKJHZ|z?!h5-x?uz zw-++o9AJX@|bQ+`S!d`Ff1~$)bHwr>68~IEH4IiV7Q+2ezGMVVdez;bNyuKoZCH2MV zHeZovS|&_A>G!WskoiWI@8!_hX&Y_aWbo=S2bEJE-?_~3v$|pjioI5h3l!ee04DpQ z3KgfJZEyM5*|X2ss%El30h%WM=RW4Diq#>-^5H z`zgx}PqX8!+mrWx(v{8CF~O)GKL?ngbKR00;fYY{`4pILp-AQEgXd3j1_YVBVGI0j zI*pQNdXCaH`E3G4MWh6ZI`fQVRpcN(%Cv{)l{!x-)fom`Xl#R2noyZ5PQ)hE1)?nZ zkQ(2WKK{C(rOOA1s-1kip1NS3kTQDWgR3n?Ol;DRZTwsjp~01A@I$tSMtg3hSacB? zfh@N0sv}w7d;82vf-Ozb~OTbcV-3~Wd#gj>!7>!T3vpN&0JF26-znxld6=Wlu)GPrutQ9dE_kb+Bb@#JTj-biJP3{aZ1xKf7kr){*8TIIR=;7H1$866Ht z&KRlhxtBF%&8wU~;jrCluwUL<;^#~{Vc}o-j0ei)*?1Xo0jr`$cF?RKyQdnTA*yJK zcFg)2S6JL(rxq$We0%i1)i6S1{%g4{U>3C+OLqs<%J- z+`q$d65~dF8C(IXSezEJO17E=UcaWQsF6!an+?RySTG6ytmgP^pGm!F{q=19X_nd> zJ?KrrK*|Y!Xhqv#RXx}U-I)W3pu!CXzHg-JoOK%*<$>WJr>~I-pRf-xj69*N3+bu4 z)#TSIe4ov@gZhQOzl`sDD+Go62{3=X2LH`9u&kMb17ODb#~cB$+5V>qLVCQm{Io8> z0W{9mRCZvPMbO5C9@k1>5aQ!Q=10#c$I_|mr;1RT%(|jDg|J0#%<*ug^*Yl(%BL!q@)BBQOZ#fM(kcz z@ZLoyIB5~aeuj&M*i74{$s@SLW-k9L0mu~{=Eki(_-?H))g`^fqtpdD%Zw45Das{w z3Y6GF*N6dy6Yn?<78;(x+%Cg<+S= zS`RnU1~Jr^FtroYW5y(y3R*e|IQm@8KL(J_(b{29O){;`$~C$mOk)ukeISc%&Jn6L zaY$9rG6Cv7Zwp#oDcq(N+ZzpUiN_#|-0I4*R&&3K^cs%}V|w3XtZ^mWP4M{%(XLv44wgpSFS;jLxXTJ`>D2K zqMmUzFMas8TK$Rwm_)*rQB1QtpI$;$Gc`GX5->teLM}|ABR(_2_hjD>fwDa|$h+?I zf(CF5@yNzqFmz9{s}VRPO>)~f<)T65W7Ndv&BDPZ@_~xCVVp$TSY4sF-+EhaQou#} zF>@T)nMwnX35UvK5+pzS+Twx)7IDR$ST)Gw(H&v4*$x7clg8)09zLX3E z53dvEXWzlF5!i~rnQlPILgV2TP>39Vs+W&HK7`RfED4_W5XMggmenKjStcB=T&o1B ze5^CnVOL&Qt{m3c%69~d)e%)6XBKA#!4xs&AT>q2MW)sR{f@5EB|61?AwqTaA{9hk zN2Nm&pa&EKdcbeZk^gP_E_(Jxf14whDIdup0~T)e+D%8!RjAos>k#^gO(@W;1BK8? zj3jU=Gc29n^+y`$_03<8=RS&`K|O3C$cjXe@c97Z!ZZ^!rcy*VGsnh8k{t?Mz8*h4 zTs}hhxRsJe^}xY#Rev`V%FRs0B4f-agb?nn0Y_z~GG--VDAd;xjV4rgNR>UFkxnpR z3QyFUq+kK9STfEw)(q^|ay9lmM=*{j{K{Y7a;Syxh+eKuLGpgop5~dZySvENwZWsj zE6cLU$()T8guBdm7De85wqW4RV3}QWS0L#l!KVRdOs0=IcL@iUEnkV=P~R^XwzM5_ z6fD#-waKbb)}X*QI}s*rlyx*4w>v7V63npIFw(W$u*~FJJUsYVNvlUv@Qby*iepiP z&-5lmn|L4?WZkOV+-o{34Li7S&NP*Gtwnjm8i#bPxRUpAr_z;%~;*Co_ zIrEI$1Mgc1i9_)6tE${0N$|Q54$W^#~qUwDfHwz~svSCeQvm%fdfQ{-u{9UfBZR@W=3yo1awR z!r00gfeBGm(T#iM_eR84?6cvkSWG1TgvpVZa#Abt2h69}Z8u=yBthd(6r1jI;N+<& zv1PlhJSRIXiC6QpA2WfZT&am8I5GVn7=7HJV3@M@Bpk%8e68BR^gUptK<#I2t+u*plMLA@K47g0GQn9aP^qVlsFdyI+}7j6$gp{T zo61MQUbOm^V&cAw7G6l27cX07pm3=`8g}{&eEyWQ$zpm_<;%BdJAKo-4VD^>b#*ym z1SimBN=J%o_{fp>SuWBup#iesHD^^ul>05TU5TPW584y3kE|sd7=mH*Wp@<;8oovr z-l46S@4{&9Y3G*{RN2?mTW+_sH_#g_z%XF}i4AF?Dlq4c7j7yO(urACH9H@7NiC@t zIQv|rL?qX$)u-PFl)1|B1^JSklX)h4!GckG*A8?LHl znKn0(nuCR1pke31Vdc1FLHd5gu~Xk<;WBHCO5+VajevYbd~vuXU)S^cxKtZYrnrb{@b z7^OAJI}##O0Te&zXr3E3$)KYFV-;g^(&yavJo!Mr8<4x)P#3mWh%jc(cw_0!yBWj0 zE>91SkFe{n-+35T?sxYV1jhth1sxVCO{Fm!7Q0)4*CSqo3b#?lH(*|H3$2~Yi6r+L zFYhR%T9}<|}VrAZye^=)r%tKYclC})Jp?V4ga<`K^r-X9@}ef zukBF5X>;?T4-~1#g1fZNww2>YJS4Ccb`(j%Pb<5Df>yp69(6aZ1TdE}Dm?|uMrfP~ zxb)`NNK>|L;VeKoBni$52X2_&DKntx0KSksp>%M!PFRT;L$Ts|6tYB(r0=`v4if_n zOo&u@o4^7L8I7;JJ8va@{lCN+dOrIipzMl)-rPVo)UeUyHH64h(&=&b=8U4#I2h4* z3GIdVerfLwBkq#miBPFZNGL0OfHOxJGTO7$8@r4qr+Mu~CZcx*_Sd0MeA4(Z1~3$+ z0gl-*|Nc<;huikw!cdBUZ$99?Pb1XD)oKqVQl$7PFVY%OZjy)eVIdR0LWTu@hC5PA zuyjdX>D|k{0ey-WA(-reIL!`sDWDcw0=;qAUFCK-=G`6pSDM~epEkb`lxM|}85Bed zss}kxDorH?=j#!|!5NtqPtg?Es%B_U*}m%r3F5d;g>9_meTvqEcS)Ty-dnPENY?AH z2(H_W`K;gU+%UwTdB{7TN@>MNVy+|1U^s87T6$9N9PpfQ!Xf1R{oC@F%{JOCieyNa zBOk%FH*nlW6dpTGT@{=>kf28z78z?bDSS2@UB%pW%I6xi$83gS?8^uN?>HjJUnLhn zzFQDn+Q^)D3%d(PlYR^+5USX+a2)^&nn#~<t#eax_u++( zgFCsomyIwE92)blFNWNjX_vt#k6g0IQOyd9zK(AN@jN!bKF(pt#`Q_+$jK$o&dM@?PRP3E3;>;G9QZ^rtef`z79JM40h~g@!=?n575z1`B~jm0qv# z$xMVR!!1fq23naty&0b13HZlMU~+C<;m}d>b+{PuuI%KUMuQ&sru7uR)O2EU<_QMe zQGxF86yFQ$Y@decF018zJ+aNEWHXZ_*^(*75h~4|yrvk8m1ABlQ7m?|!05XdVc-~# zR@>eH6ITY9`2WWQ_t!fU=}O}O$pe%p<0hkhjjZpvy0sx{+4%!+1t2L2W5~#4u^2m} z_N*vknGBnyo$GtN!Q@tX7Q)aaSQs-NbHi=wP~&r0@tjvb-mbc@wYYtL*Y5cMn-$;$ z12v*qd7)2aqu=T0E85D#R+U#Txk#2E8;1d27gy3{6{OZyIj*bJB0R|ORHsIpfR?o ztm8HdaPM%qrpmd8$Sf5bf}0j#HXx?PSJH|`bmxe}LdSM3`ZtvpB5kpqA=HmAQHoKv zM88O-cp|Kuy9cJc#&PqK;JCUAuCgziIPR<}4c^g_&o=k#2s!l}SEV|jJ7*t;Z3Jvj zkX$Ksqv}cHdmhLKXk^U$n`pc;AX@ARrFzwtF)U0W^jd!21c3$tbFYrJDf1-coq-x6 z?DjTtt{nZ>h{e2g3tfGa&d>_Z;KeN6&r~f|1~NKR7{(BHj}9AE#$U59X6m-+Cx)Oy z@lLc+@yL2ZpDMtfGaBADtrbWaoqWX&4gU|_Jq(G%!ue69mB%Y@P05?@7u+UeX=hkgUw|I?Dcdjue2B= zwq6;V@dpJX@&$`Wr*&ft!UDuwb>nKxVkF?EtWe*GeC7V@;7yBa>IVU^>}J5`8`JL$ z-hW%K#VfA;5FUM!qeOvm=vY=_L1xEcVEg95j3G;sk`!eHWsKn7EYRH)r|Gand&hsf z8Air;192mcId1jE&>z%nDg*yI?Zjg@ZE4Nh>j~Hvs9y|giH&JtEXRBc)0t+5mIX3d zHRB>@K0v9}PKbfKbAq(gnRg#gC;Yzrj^d8bU1~*_-~lhvwpl2EKuG$xyn)V^s#pDU#)$nM})3mrm7D4QG7 zF)hDF!EEahR1CDG&yPYFj{WYlP^hzR^w%@~Fme0qF|mvS6?FT`X$#@zoYKHMr%IaZT*dKvjl3uv$4V z8M7cGI8~L5z+#$_>7Fs=CGOXGO@>s)5iz8gj-ExVV_ytgTm=2~U<%=Pk>c}*DOIB< zR>s_lBNVo6OAw_`HJ*9kWulw)lsAvsUHdw?F0wyn`fqOahRv&jLdz246#N zWD|uD<>xD-XarX4&XXu^?HLB8$i%%neWxXX`jHCV%jbE$Z@w!6o4u*Bg*O=*QHa!T z>8Gf4n07lEQy~gIOhABnn0(sjnYs%rmcABue;!G9wPxFf4EzBKIPT0lN|Y&m_{3C zicNUtWo?q7#(T#rw8GR&eZ0nJPkBv^?X-fgg^$h8EM2Q?v zma4}Z>Pb48ws!^)Q8iV(0X2tsU5ht(+qhg&QADYJGR#kiO!uIHo?`6xetcJ`g?ln3 zNV-5KK;EQuhEGyjl(*ChG9fu8c61F~(mIBc8}qg9L_}R}w=L$EEbB%bA3K4PVWO(* zJ`SW3ub(*SHiEYa3@LRwZ0E;z@O#)6r@V2G4i9?@OTswuF^;zHL4~qPoLLk##aFQZ zPMAxiwjkg0rJ^YYNm=Ea1U(&u7Iq%NepnJ)0xmz$66f1l2z-9U(IREk?s$P+3^9;& z1BrXCFy+3J@Bqe4+Az8A-6$Un(9G2y48}HDl-)k?An98g+wqn@yf{@Am|uf#f&>KA zNAw4$3Hh8di73T^GC&3eyGqE# z_zub>B?BpZ%9)|MR4B>O^;9h?QxTO6Q7A1t(YGq`T;a1kIl5fcTynQ@UwUt$x!-=3 zoID}}Pjp(K@$yaCTDbvifk-h%CYqCjWH`{?7aML6i@FaJK^Mkv8#34*y^~ zTaoKXcdF=v`W8;QqnS1r=Hc9zZk^;gmMgQg)PAnreWi{dxmzBgt!OUPvrjx@yM8=$ z+sxa{8e2r^@TVB~A7{;YK29%GOq1Z9Y%%X#gWk%Zgi3O0cgK2a(GZ&qnuLbST%NI* z4o-V|)b%ktLNkPIBSlC%73*KwCD-hHhZ+clzEy(ur`q6FQLJ}q;s>tz9}ifqqmHQ%8yEX6L{6kVmMPlj%{_|b zR3W#Vv-t%3*FL@e6qPHrWww7b2kK!m=W}lv zpLOh@bA-Q4k6|ffaG9z0KzMH{#&nW$`k5}tGR8;nZY!tgNI7QnK4OK4dPdoDW`ns< z+Y#t~zq55Y>eLX*HJ$V}Ywqa=>F%ZOXl*@r`&!Hh^~t^l%z74h!Oh;n7KU3@Yi5@eW$iQF zPgLf$>dhr8sdlEQIs+_J`qa&(+=B*6SWc~9pi-9mbTt>kT|}$8calGc9cB_TFRK_a zt2HnoS(TWFrO*XqSFG-05hgQ`J#-!Y*kA#(%XYw3BsDOK|g|0 zrAfbD<<-VIbIyd_ZjunW89pid9p*Tg)9G9R+)?u`%3 zaa~Z}jH8%SSkvG}2o0`fwlGZK$2z_fp(IL zEOr17wHC;xYzTEQ`hlfZ1>7K~$f9``ZehVJsEJ_4AaG0JwsqM$j49eJ1uH>0y1W52 zD>rCBAWaze8^?g5otHfZ3o&zCkbTDMQs22*y<_8)6f430)AWSe?CB_4$Hky&#;u0; z#}oarTU^(560Z^KK9N{?YLlQ;r^NTC3oX7X<>4Uf8QhnsGe2NsKwMUgt%{?rHtIlS zq*fkqt#_`i3zhGKL#mM(4QWuJ#Ah16eialpWN09r?m`mVy*yJmwx>k(&Dh~HYM5*) zw*%SqMNGC}77Cca*l{ul_3rSHL(pgYH`#lUbxU$L4HY?{uZpRfX75p-dSkpHeTi+XYx+Fg+FMK5fE!+HXt zVK}S11sVVS8@_9x*AQ&3*_amnWOkd}dlWD(W-UwW)@@T+!TXE_o7s{6f``$4SnrHZ z@m8r}`H3@2l8b|Ru5b=C)IB5m?qS;!DyCiAJ2Q6<;GS^SfYOE|Y5i@sK|=gPq5b*C z*#W9~lq{{^(A3$tFg|@+aJ}6e-2q?gf`Dy{Z`VDwdJy%u+2sZ@C6zYFhYIbDHv(T9 zgb3WD^FR423}nShKg}c^++*hUp(=DV-biAYg+o>)bvSoYVrIQN=VGB#9UHb*LWudw z3Bh}C-Tju&{{&r_r^5x~fq>uewA*7~oqn1ZoWJX%xkt}>1!TP?1pE-2KmJw)83++_ zJE>P&`o?;#!myuzvN7CeAM6IX4^Hi5nf-8He(f2{Ccrb@OJxa4wqw|2=ZDg1o$}um zF*S=K#73<-nOMBAd=V+w_7X3s{Xd4j%G@x4QXf_<4C(YlvOC_d z+TRH8_{_MtzIy}ie}C%+nOxp-0Srv3qD2D(%SUL&(T5qq>ZP#P?n^{kCI+%tmrRJ# ztc}Z2su;*&PVauu%UsZJi~?cMYYYiFF{QoiM?_#*s}zbx{~@{E?6jT)+x**zEe8@k zo2Eu6v6+QzDIB?YidBl*a(G{u3)t3CFJMba3Cj^?rTAvFbSnAS7m2rR?>=|XX(q|*F9dhu}Baeu8>^E=z-e8#c%ibao^HEw(LjtmPHC8Kwa6j z*k+ZEbA3`)=YKyz>+Rq4)g&8jh_?b0`7j3BbZfn-($O}Vp9rL>Ljd(*ouxeQ!ZAPh znI*7fk7e$*?_=^&H$^~Dn-sh!dPaU8D*PPqr4oak5k!r#CH)cAI}TTrhGpwMtkM;` z%PjwYWAYK#Ns&n>bn zX_KQzo6E~;^K)uMIbl*N90{AmBzx0!m7RJp&m%`mXX(a(!cfv^yeb%Utc~NAS)dW?$B!qu zvLcP6jQ_>BSK$)&Q^gXh;s6rMc~GgXW{Y+pC2SNr6uU^5B*a(hp>4K=Ft2j9qLDG@ zP~O50IS?4-sYcrj;-tl#=<=~k!D!7Sc)0J|gm&x(dn589rfAh9<5H}h z_Hzt`i-P_A!g1>Hb;XQ{vaBY~OVu1$l01$M;>g2q;n^??;#-!=tc^0FL1Hfp)cT2E zLABq^ScK-B2|jS$NA!l3rCbznaLh*mm#R-}y#&>|j>*!HzM>wT z)^S}cbDNziBK2VuGHFV`*H58@)CmC@bgwI5F5FhR{#;(-eQRbXpTZMIBlYGr#l+@fe67mq)c2Gp7>yIGDMKr* zESnf-KwCl*WEw#yz?CJrP>vZ$41LBiuL)Y4_XtB4#1Wq(9RVUM@(y$Wn5Zm{G7*QSL{@HWXGGP0uK??ZQ% zgB}|_wr7ULO(`7*B~{rOy#opm@)KY04;h_fMSAdj&I$esL6V_Gl@a+CXf1*zl5J9{ z$CXxF4t)|$Ls~WJgZGjdwUZ*Vwk)k9vbsc-iikQkuk_Ic64-uoO@tSC@im1A{#%Ij z9EOiskRS8qG9@vi)mnFE}h>td{W=7K;Nl)@iZh($9#LejWBiH&(@%iQF z&q``C*9x$2K$@bx<=M~i_f?*#SNia$k2qtVknVXUDyRrf7!RwZNi?cM{oibq*8 z6$mnSX9Uu*rGuL(?j2l^?BfWJ@du(dPMDXZTnbuS=cr0mOiyP`XZg3z1*bp0ntPAb zZgI=`9-J2;{+zqAhf(qp$At-D(jD|}W3HoJ)EZYjL2l=r0zNN9>NPo|m;!HRbQxPu ztIreEdq!U_2Sy^yiugvt0!tuB%k?H~DI6&fI$AI-h;;RBSbaNswdLIoef*e5(p0eK z?8cxfSwHO7nyj{#>`jr{CFLW^?6| zt&U5&4dJ;7W1h+0)mb6VQ=NjOeAj%esVQnn90T*116E07eFb*#e!nFs6s7HI(mp9C zb1ZnD?vtG=g~bd|H_{acWov+73tK8o;3#yZf<#DoJH_C(K7;y)kvU7c#;0Y_M5iff zff_o3w?|$+1vj2@7}MgHy3PS)2r}{*Jf7ba+AAtIILiD`K2>Tgv`M*zUh7Rk&+B#^ zjb9#kI)0GeGa(|_&N7YT4Rh9k0?%I|*(a@;4(0KapY1oZs)g7fl%~UN$z!fHOjpbP zI9IYGb(8GdHM~s!MllxHbfzhSw+0bg6sd$2gfcmTizl#GR}KM__mGKe zgaLd)6CN_;>V@?{AJ#TJ-ly(PxZG;p;muE8H%6>(XkXB+N%3#1?)5)#JqF18Nh7Vo z=jd}#>Wa<-C6O9B5Z*JshiPGzXiskwwjt(OD>MUYCTG0o4!F9W37ws|r080aW;GO! zgQ$iB^TLvUYi0*Ku>jui%-0%L#k&5fkK|LVneQsXUNGdXmRGWu2)`K8&8_+!6pQVo zWgEoes+jfRA=q7!6tiRsr>PaMcf!>9E|9Y396f{axhrw+7H?iY9sTf!yWK?7YzXZc zdDV_&<5qXcTZ?U4t=`D0$;On^GpnTvbP@E8^&|Bo_SIK${#SP# zRNfIzdGAlU>wwXR_xL-AA(jKj)AzF~_PqV)g6S!~p`xsUjST0>hYmo<6B>$F zM2|lpOqL5oyE{jS6PA!Ggx%a1)fQFKMgwK^ZOyDo3o3EMY%j%}FMZzq_*Q~udQy0! z8!APDZPbe$=)TWOW0@r1gx+Zm0_7%e>pCw~iK;nX=U4#g)hY}u4*e_(@EZT5=^Zn{ zqi~A6x33jn&hVZM1<{k7JA(^txIGLr?-&Q;g6R0xCrP1u(>M(AS;ka<*w?1xg5DK= z&gh38`F_sq@BxTaJBG8NSBw3GWH>&nTYr%j0nO^hnIyjWuG)gUq|r!J72s( zQ9I@nvYuyFQo-PsJ2RoUs3|4{4-GKi9^konDkbp@DMbs%5!G&}_@IxTvl79r$-W41 zt_i!NF7ldQ`}Lbl=#)J)_+K?THK83jVPpn4^DmC)wBntMn(_xdq?8(S6iNo;9g zN~B7;KXQdkd72}^h%<;}!nG)Di%b@0iPBEeRs$N@f=E8fByMuxgQk>p_C#QQK3GbE zCv%u@9t#v1e**i>*%-D>%c<(?Hg0At>A40*dS-wu-!=EHhe_iU|I>XxKgbQks(co5 z5G=Fr>u|Jfg#s9om6OoCA9-O|`7!=+YxIkjG+ zffqf&RDupSTdt835F7DMe8otTHPoN3V<6596(TG_gTl=JoYeEwZnoGo5X!+$ffZV@ zDLdVsCNdn6Q@O4t)Og`oC4cg!)L3z+vo9UUA3iFdHbq*a6GF;N)lwR_K6F-e(;>GO z-bAVba<3J;j;%8?0uZVAQF3o&jxw#1RhswRl-S*vM2Jihn5^sgsc~`GF6#l*nXJ(J zp)^%#6D4VM3!BfqJ85JALb0+?gq{@vS6nAJ26bj0W#RIL7d3+l(j<~ua2qJN0nX1$(SFqy{@V+=c{!kMRYGfd7BHFiEr%ruyW%=$6 zQk=9hK*=bgE3XJ9$3GU|kxAt&%1HGSyhj6U78jGLb6~S2jnmeJ(FAzd>CGi@eZ2GR9Z=FBTx(oWXf_9$H9g-`s$ToG z)}YDsG?MJ*vC9lB_>2uon|!}PLw!9kM;GWmmCyE+y2S>8f+GL~=~(@l%UbDr$?ri;;(F=k=*47=H%>sp0WgcIG-(6_f`^{)97RwjQx#qX(tV@lyvVh*mp} zwEd!O<_PrY=6P4m53S%Gio5jHQK%#9aek-|eyZbSivBL5e7Wn1H>km46@HX}+#W!; zkE|+24`Q9pr#Z0^{DxfkuD z8)zt4=Tbp!2`)r=z$+QuW@98LOha{ww$4yU>uz$Xty02DDL5XIWhXB$NAtevCg<@|3-I0P~L}_bb%T11E z!!?^hhf2X#8Xw_Q)tua0L_7)&7Xiv&EAW)C{L9|c9l?AsTj`G*LXum)aKfQ(9~K`5 z!{e5iW-v+@?CeHO$Tfig{W$$Y@NFkXxvD_@P4JjUi#H@PyYrQ@UCL>BQ8A~gmYIza zD&K10#KEnJT7%q4V8xqrGIYcwBK7ZWX|DN*w5!Sou$%+zoOj0BRgPO+(#HZAyLMku zcsMg}<35zF2^PijkGe2zyEA^cX9&}-tiq<>^lAx!)ghD2<*`e9^+jSsFPt!_a57B% zl<}!QiFA`A^0iIO4YF&TGhSDJdIh22tH@1^b%~FNqFqo!&}+wIdGec*QfW9IF+v`G zDgkodO~hB^j$?ri;nHn^>7N}C3CVC7sd^e-Kl_whz=uOl@h)z09H)G{UWWW&_thBc zd4n5}b!cgito~X~yie;XnAndu_=~X6_oRs9_YfaE?%GlpoY*o~k6M~?oJvj?hSJ-2 zZ8o1Q_*U-IhxUYVI7#+I6HpUP%5V)Qx=B3KoSf58}Y>=eg11-2R9FpkCuYz4k^6cz^#;i3F~njn~HzaRt9iZDwH=&|*>kyxDeYO<*( z3uEQ6%@CA^Od3_;R7@r<(T%e+_q2q49#sD>iUzJ!&zG>9Qj>eQ@vAr9R?c^qv1KLr zO-z+RS|Ll63iVnS!9AdlyYKg`8F{-2Z)sNCBI`TO)9&eSj*m7eJQpYnK;7F_WQ5y> zg(Gu`gh?SB&bwg^R`{U~#p{V(<11@#-v`0kw zS}1}P=-ISGq3A7dN6(!;c2)-RZq{~N< z^hi$UyiY&zSmR`FfA)BOrHe>SY53-if()Ub5W*cpX3kDfXsRSlUX)KpA1w`;ou=2x zrv~cw>+R~i&9+boXe9R$OFLD;g6iR`q}A^MMXCV@wA6b=(B1kv!yC}XO8J~`yjxIutyy~zx2%eY<~?a{>9C8s#6}rYw!ms^%_KhHfD!J- z?H9LAU1zWt)cuWY-lAaQ9aI0#rE>G6u8Q_sD;8coO(i-rTN_2JHw;PiX^A3ua<4_w zczqpH(s)!ztX_`}}4<`zQ0^u!NRB;VLWoI-r? zyDHMQOJeaeFH*|Qyy-6z!b8TLOL55nt*$Iq~D4U!4026J)jY0Gw-u0i0{)`b96Ww=p*|aQq!z-}D%1`7QyJz;Q58 z5fA=1-8qLHpjgOGTf_?C)Hx&=*TUQhj8?(0AW+Xzs$_HzubwEjP>LBBM7C&-_tQAn zE}RQ&PUtIuuBtQz(6HSszgESIQwAU5I75CxMuhehlTfvA36N22N~>H(B5cP4*DkkK zpJyM_kmed`H;@uJUl`fTz<3?0@z$-bFzLWy=`3(X<-0HUqC_S&?M)V?zfYibjfG+m zv4OpljN0XmiK)l*yiia;gn8LzhuFxK`ra4ZGLgOHy|Isbr1LU2%cOD0bKsFkXOV%C zI8?#!K786~<-eQ@;i4c4=J8z&(D#;_jktnB$1N{g2zC5!e4s-mecdpN3%yob0H>zB zdWxmeiW{E0Y{r1c=sjQo*VX9_A7RVkpY8&oQMJaQ#9(sFkA?Z>La$&fHQ6dIeC&wV zKVw7~8cgvsvI8zm0b1d!+%RMhs9{E}j~f>n-|WC?J%y*=?MVTrWQY!b*fR%CNfxDs z`gH3;UUc~)SS1#SJNd^ueE^JZoPU3(FH^DoY3=etfipd3SgKn9C1`x1#HzM#&U{vM znNS@g9nTmE^yyH@gjuQq!{s*BfM&#kVy&P&amg3`fOMwi`)t`byQg$C|MNzHXI zC-kyC&R7IYDGNvxI8Qtar{_(-DvIycD=DjTQ?Kf>K71BV!6S3mvf9Z?xUy-7Zc{)2 zqsdHij`eGfhkn+gCG9LaF<+FKn0ALs2+qrOg<;?iV>z4ESjkk#@ecR&0)S;NloZuh zgDQ933dA(L+K)0w4qd*Uy3hxYc(uvoxf&H!?6X zvvvHlyuCCn)!4}RIrXTl6m2!@B=a0IC}4pM0h#2Drico75Fi==`1=(w3J{=ve*y>C z-oFY!!0knm6;%?Xm6Q{sfBBdwzk$e)nyCP;A3yeI`Jo&8e~-xu%1MfeDk{;*ioHbm z@x*_K0muFRRMG(VHuffeFUrUL)}YP{~<93;jqc_Osvt`tC0Pgludae<=Rj%IcX}10pJa>ioZ~o2j3naV`LF z7H|>�A``0fKpc0WAU$bg;D1GyIQa;7hdW#MKpuc+fPkN63DB8-QCon}w55{+ zK*~kT%+g5EzyQD?t7onEf4S{n5`Y%HU(o_IxB{TT|7ske_`f6&x7P#Y(^Lk?K1$eF z8Ohk#SUB1Kx@itd&0`AyGX5-pngUK={i!e#{R8yBlYsrOyWkeC%j+RF5iuzNd@qNfB>rpz#I8f@s{`{nv9Lfe|_68v(EoSLz4a_*l*>a ze`!-MGn)To!IAynEWd7smziIGVoE6e67%Kc<1cw&U)K0#-o>Bj6zac3|F@C;A`9b7 z=$C2lenNw4{S)+GliV}2G}0N|fG z)sG;wmk+am&9E z{i*){Mdkk`{7ZrQpYTT3{{;VHviuVEr7rtV*j}4|g8j3f;U(rv3E-cYWBU$VtD_%M1M5Tztu!v61)^^{7FFK`5OfPAl>+q z>7}IGPbO2}-(dPJfwz~OFNL~(a)Jl^2IoJ?cDeQ`pGlj`8S@I)6PGc(f|02zx2HPq$%$HzbV~+ v^TYh7&j0bc{Ml*p!|U?1+ylV=n-AuVG#FqV^dowa3FsZ*6oN|6kH7vOrq \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..e95643d6 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f3c2c0d4..00000000 --- a/pom.xml +++ /dev/null @@ -1,370 +0,0 @@ - - - 4.0.0 - net.canarymod - CanaryLib - jar - 2.0.0-SNAPSHOT - CanaryLib - http://www.canarymod.net - 2012 - - - CanaryMod Team - http://canarymod.net - - - - UTF-8 - dd MMMM yyyy HH:mm z - - - R7 - 1.4.2 - 2.0.5 - 0.9.5 - 2.0-beta9 - 17.0 - 1.5.21 - 1.1.1 - 3.8.7 - 5.1.34 - 4.12 - - - - - BSD 3-Clause License - http://opensource.org/licenses/BSD-3-Clause - - Copyright (c) 2012 - 2015, CanaryMod Team - Under the management of PlayBlack and Visual Illusions Entertainment - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the CanaryMod Team nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL CANARYMOD TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Any source code from the Minecraft Server is not owned by CanaryMod Team, PlayBlack, - Visual Illusions Entertainment, or its contributors and is not covered by above license. - Usage of source code from the Minecraft Server is subject to the Minecraft End User License Agreement - as set forth by Mojang AB. - The Minecraft EULA can be viewed at https://account.mojang.com/documents/minecraft_eula - CanaryMod Team, PlayBlack, Visual Illusions Entertainment, CanaryLib, CanaryMod, - and its contributors are NOT affiliated with, endorsed, or sponsored by Mojang AB, makers of Minecraft. - "Minecraft" is a trademark of Notch Development AB - "CanaryMod" name is used with permission from FallenMoonNetwork. - - - - - - scm:git:git://github.com/CanaryModTeam/CanaryLib.git - https://github.com/CanaryModTeam/CanaryLib - scm:git:git@github.com:CanaryModTeam/CanaryLib.git - - - - https://github.com/CanaryModTeam/CanaryLib/issues - GitHub - - - - Jenkins - http://ci.visualillusionsent.net/job/CanaryLib/ - - - - - vi-repo - Visual Illusions Repository - http://repo.visualillusionsent.net/repository/internal/ - - - vi-repo - Visual Illusions Repository - http://repo.visualillusionsent.net/repository/snapshots/ - - - - - vi-repo - Visual Illusions Repository - http://repo.visualillusionsent.net/repository/internal/ - - - vi-snapshots - Visual Illusions Snapshots Repository - http://repo.visualillusionsent.net/repository/snapshots/ - - - mojang - Minecraft Libraries - https://libraries.minecraft.net - - - mcstats - mcstats.org releases - http://repo.mcstats.org/content/repositories/releases/ - - - mcstats.snapshots - MCStats Repository - http://repo.mcstats.org/content/repositories/snapshots/ - - - - - - - net.visualillusionsent - viutils - ${viutils} - compile - - - org.jdom - jdom2 - ${jdom} - compile - - - com.mchange - c3p0 - ${c3p0} - compile - - - org.apache.logging.log4j - log4j-api - ${log4j} - compile - - - com.google.guava - guava - ${guava} - compile - - - com.mojang - authlib - ${authlib} - compile - - - com.googlecode.json-simple - json-simple - ${jsonSimple} - compile - - - org.mcstats.standalone - metrics - ${metrics} - compile - - - - org.xerial - sqlite-jdbc - ${sqlite} - runtime - - - mysql - mysql-connector-java - ${mysql} - runtime - - - - junit - junit - ${junit} - test - - - - - clean install - - ${project.name}-${project.version}${build.number} - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - compile - - compile - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.0 - - - package - - shade - - - true - shaded - - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - org.mcstats - net.canarymod.metrics - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.3.1 - - - true - - true - true - - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.2.2 - - jar:jar - jar:jar - @{project.version} - - - - - - - - attach-sources-javadoc - - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.7 - - true - ${project.name} ${project.version} -
Generated: ${maven.build.timestamp}
-
- BSD 3-Clause License]]>
- - http://docs.visualillusionsent.net/VIUtils/1.4.0/ - http://www.jdom.org/docs/apidocs/ - - - - - PluginDev - a - PluginDev: - - -
- - - attach-javadocs - - jar - - - -
-
-
-
- - - jenkins - - - BUILD_NUMBER - - - - -${BUILD_NUMBER} - - -
-
diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..ae239c6c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = name + diff --git a/src/main/java/net/canarymod/Canary.java b/src/main/java/net/canarymod/Canary.java index 071aa89b..a8652de4 100644 --- a/src/main/java/net/canarymod/Canary.java +++ b/src/main/java/net/canarymod/Canary.java @@ -1,6 +1,6 @@ package net.canarymod; -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import net.canarymod.api.Server; import net.canarymod.api.entity.living.humanoid.Player; import net.canarymod.api.factory.Factory; @@ -425,7 +425,7 @@ public void reload() { * @return specification title */ public static String getSpecificationTitle() { - return Objects.firstNonNull(Canary.class.getPackage().getSpecificationTitle(), "CanaryLib"); + return MoreObjects.firstNonNull(Canary.class.getPackage().getSpecificationTitle(), "CanaryLib"); } /** @@ -434,7 +434,7 @@ public static String getSpecificationTitle() { * @return specification version */ public static String getSpecificationVersion() { - return Objects.firstNonNull(Canary.class.getPackage().getSpecificationVersion(), "dev"); + return MoreObjects.firstNonNull(Canary.class.getPackage().getSpecificationVersion(), "dev"); } /** @@ -443,7 +443,7 @@ public static String getSpecificationVersion() { * @return implementation title */ public static String getImplementationTitle() { - return Objects.firstNonNull(Canary.class.getPackage().getImplementationTitle(), "CanaryMod"); + return MoreObjects.firstNonNull(Canary.class.getPackage().getImplementationTitle(), "CanaryMod"); } /** @@ -452,7 +452,7 @@ public static String getImplementationTitle() { * @return implementation version */ public static String getImplementationVersion() { - return Objects.firstNonNull(Canary.class.getPackage().getImplementationVersion(), "dev"); + return MoreObjects.firstNonNull(Canary.class.getPackage().getImplementationVersion(), "dev"); } public static long getBuildNumber() { diff --git a/src/main/java/net/canarymod/api/world/blocks/BlockType.java b/src/main/java/net/canarymod/api/world/blocks/BlockType.java index a80ff1be..4b9a06bd 100644 --- a/src/main/java/net/canarymod/api/world/blocks/BlockType.java +++ b/src/main/java/net/canarymod/api/world/blocks/BlockType.java @@ -700,9 +700,9 @@ public final class BlockType { public static final BlockType ChainCommandBlock = new BlockType(211, 0, "minecraft:chain_command_block"); public static final BlockType FrostedIce = new BlockType(212, 0, "minecraft:frosted_ice"); public static final BlockType Magma = new BlockType(213, 0, "minecraft:magma"); - public static final BlockType NetherWart = new BlockType(214, 0, "minecraft:nether_wart_block"); + public static final BlockType NetherWartBlock = new BlockType(214, 0, "minecraft:nether_wart_block"); public static final BlockType RedNetherBrick = new BlockType(215, 0, "minecraft:red_nether_brick"); - public static final BlockType Bone = new BlockType(216, 0, "minecraft:bone_block"); + public static final BlockType BoneBlock = new BlockType(216, 0, "minecraft:bone_block"); public static final BlockType StructureVoid = new BlockType(217, 0, "minecraft:structure_void"); public static final BlockType StructureBlock = new BlockType(255, 0, "minecraft:structure_block"); diff --git a/src/main/java/net/canarymod/util/NullPlayerInventory.java b/src/main/java/net/canarymod/util/NullPlayerInventory.java index e55c78fe..c1657262 100644 --- a/src/main/java/net/canarymod/util/NullPlayerInventory.java +++ b/src/main/java/net/canarymod/util/NullPlayerInventory.java @@ -61,6 +61,11 @@ public Item getItemInHand() { return null; } + @Override + public Item getItemInOffhand() { + return null; + } + @Override public Item getItemOnCursor() { return null; From c16c60e1401a6bfa20c69c9dcd0a4c6184b22a2f Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sun, 31 Dec 2017 00:53:23 +0000 Subject: [PATCH 11/12] Logman is no more, enter slf4j --- build.gradle | 8 +- src/main/java/net/canarymod/Canary.java | 7 +- .../commands/system/PluginCommand.java | 15 +- .../java/net/canarymod/logger/Logman.java | 1063 ----------------- .../java/net/canarymod/plugin/Plugin.java | 11 +- 5 files changed, 20 insertions(+), 1084 deletions(-) delete mode 100644 src/main/java/net/canarymod/logger/Logman.java diff --git a/build.gradle b/build.gradle index 6542795f..5e886415 100644 --- a/build.gradle +++ b/build.gradle @@ -33,9 +33,11 @@ repositories { dependencies { // Provided by Minecraft - compile 'org.apache.logging.log4j:log4j-api:2.0-beta9' compile 'com.google.guava:guava:21.0' - compile 'com.mojang:authlib:1.5.21' + compile 'com.mojang:authlib:1.5.25' + + // Logging + compile 'org.slf4j:slf4j-api:1.7.25' // Other compile 'net.visualillusionsent:viutils:1.4.2' @@ -62,8 +64,8 @@ javadoc { options.encoding = 'UTF-8' options.charSet = 'UTF-8' options.links( - 'https://logging.apache.org/log4j/2.x/log4j-api/apidocs/', 'https://google.github.io/guava/releases/21.0/api/docs/', + 'http://www.slf4j.org/apidocs/', 'http://www.jdom.org/docs/apidocs/', 'http://www.mchange.com/projects/c3p0/apidocs/', 'https://docs.oracle.com/javase/8/docs/api/' diff --git a/src/main/java/net/canarymod/Canary.java b/src/main/java/net/canarymod/Canary.java index a8652de4..d031d382 100644 --- a/src/main/java/net/canarymod/Canary.java +++ b/src/main/java/net/canarymod/Canary.java @@ -14,7 +14,6 @@ import net.canarymod.help.HelpManager; import net.canarymod.hook.HookExecutor; import net.canarymod.kit.KitProvider; -import net.canarymod.logger.Logman; import net.canarymod.metrics.CanaryMetrics; import net.canarymod.motd.MessageOfTheDay; import net.canarymod.permissionsystem.PermissionManager; @@ -31,6 +30,8 @@ import net.canarymod.util.JsonNBTUtility; import net.canarymod.warp.WarpProvider; import net.visualillusionsent.utils.JarUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; @@ -47,7 +48,7 @@ * @author Jason (darkdiplomat) */ public abstract class Canary implements TaskOwner { - public final static Logman log; + public final static Logger log; private static boolean latePluginsLoaded, earlyPluginsLoaded; private static String jarPath; private static CanaryMetrics metrics; @@ -80,7 +81,7 @@ public abstract class Canary implements TaskOwner { static { System.out.println("Please wait while the libraries initialize..."); - log = Logman.getLogman(getImplementationTitle()); + log = LoggerFactory.getLogger(getImplementationTitle()); try { PluginLifecycleFactory.registerLifecycle("java", JavaPluginLifecycle.class); diff --git a/src/main/java/net/canarymod/commandsys/commands/system/PluginCommand.java b/src/main/java/net/canarymod/commandsys/commands/system/PluginCommand.java index e9d2eae9..1d37ca44 100644 --- a/src/main/java/net/canarymod/commandsys/commands/system/PluginCommand.java +++ b/src/main/java/net/canarymod/commandsys/commands/system/PluginCommand.java @@ -1,13 +1,12 @@ package net.canarymod.commandsys.commands.system; +import static net.canarymod.Translator.sendTranslatedNotice; + import net.canarymod.Canary; import net.canarymod.chat.MessageReceiver; import net.canarymod.commandsys.NativeCommand; import net.canarymod.exceptions.InvalidPluginException; import net.canarymod.exceptions.PluginLoadFailedException; -import net.canarymod.logger.Logman; - -import static net.canarymod.Translator.sendTranslatedNotice; /** * Command to enable, disable or reload plugins @@ -49,13 +48,9 @@ private void reload(MessageReceiver caller, String plugin) { sendTranslatedNotice(caller, "plugin reloaded fail", plugin); } } - catch (PluginLoadFailedException e) { - sendTranslatedNotice(caller, "plugin enabled fail", plugin); - Logman.getLogman("pluginCommand").error("Failed to load plugin", e); - } - catch (InvalidPluginException e) { + catch (PluginLoadFailedException | InvalidPluginException e) { sendTranslatedNotice(caller, "plugin enabled fail", plugin); - Logman.getLogman("pluginCommand").error("Failed to load plugin", e); + Canary.log.error("Failed to load plugin", e); } } @@ -70,7 +65,7 @@ private void enable(MessageReceiver caller, String plugin) { } catch (PluginLoadFailedException e) { sendTranslatedNotice(caller, "plugin enabled fail", plugin); - Logman.getLogman("pluginCommand").error("Failed to load plugin", e); + Canary.log.error("Failed to load plugin", e); } } diff --git a/src/main/java/net/canarymod/logger/Logman.java b/src/main/java/net/canarymod/logger/Logman.java deleted file mode 100644 index 8506e4a1..00000000 --- a/src/main/java/net/canarymod/logger/Logman.java +++ /dev/null @@ -1,1063 +0,0 @@ -package net.canarymod.logger; - -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.Marker; -import org.apache.logging.log4j.MarkerManager; -import org.apache.logging.log4j.message.Message; -import org.apache.logging.log4j.message.MessageFactory; - -import java.util.concurrent.ConcurrentHashMap; - -/** - * CanaryMod Log manager. - *

- * You can get an appropriate logger for your plugin here. - * - * @author Chris (damagefilter) - * @author Jos Kuijpers - * @author Jason (darkdiplomat) - * @author Larry1123 - * Updated to make use of log4j - */ -public class Logman implements Logger { - private final static ConcurrentHashMap loggers = new ConcurrentHashMap(); - private final Logger logger; - - public static final Marker NOTICE = MarkerManager.getMarker("NOTICE"); - public static final Marker MESSAGE = MarkerManager.getMarker("MESSAGE"); - public static final Marker DERP = MarkerManager.getMarker("DERP"); - public static final Marker PLUGINDEBUG = MarkerManager.getMarker("PLUGINDEBUG"); - - protected Logman(String name) { - this.logger = LogManager.getLogger(name); - loggers.putIfAbsent(name, this); - } - - /** - * Get a Logman for the name given - * - * @param name - * the name of the Logger to use - * - * @return the Logman instance - */ - public static Logman getLogman(String name) { - return loggers.containsKey(name) ? loggers.get(name) : new Logman(name); - } - - /** - * Convenience shortcut to System.out.println(). - * Prints to the output stream on a new line - * - * @param message - * the message to be printed to the console - */ - public static void println(String message) { - System.out.println(message); - } - - /** - * Convenience shortcut to System.out.print().
- * Prints to the output stream on the same line - * - * @param message - * the message to be printed to the console - */ - public static void print(String message) { - System.out.print(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void catching(Level level, Throwable t) { - logger.catching(level, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void catching(Throwable t) { - logger.catching(t); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Marker marker, Message msg) { - logger.debug(marker, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Marker marker, Message msg, Throwable t) { - logger.debug(marker, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Marker marker, Object message) { - logger.debug(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Marker marker, Object message, Throwable t) { - logger.debug(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Marker marker, String message) { - logger.debug(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Marker marker, String message, Object... params) { - logger.debug(marker, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Marker marker, String message, Throwable t) { - logger.debug(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Message msg) { - logger.debug(msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Message msg, Throwable t) { - logger.debug(msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Object message) { - logger.debug(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(Object message, Throwable t) { - logger.debug(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(String message) { - logger.debug(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(String message, Object... params) { - logger.debug(message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void debug(String message, Throwable t) { - logger.debug(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void entry() { - logger.entry(); - } - - /** - * {@inheritDoc} - */ - @Override - public void entry(Object... params) { - logger.entry(params); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Marker marker, Message msg) { - logger.error(marker, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Marker marker, Message msg, Throwable t) { - logger.error(marker, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Marker marker, Object message) { - logger.error(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Marker marker, Object message, Throwable t) { - logger.error(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Marker marker, String message) { - logger.error(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Marker marker, String message, Object... params) { - logger.error(marker, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Marker marker, String message, Throwable t) { - logger.error(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Message msg) { - logger.error(msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Message msg, Throwable t) { - logger.error(msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Object message) { - logger.error(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(Object message, Throwable t) { - logger.error(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(String message) { - logger.error(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(String message, Object... params) { - logger.error(message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void error(String message, Throwable t) { - logger.error(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void exit() { - logger.exit(); - } - - /** - * {@inheritDoc} - */ - @Override - public R exit(R result) { - return logger.exit(result); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Marker marker, Message msg) { - logger.fatal(marker, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Marker marker, Message msg, Throwable t) { - logger.fatal(marker, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Marker marker, Object message) { - logger.fatal(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Marker marker, Object message, Throwable t) { - logger.fatal(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Marker marker, String message) { - logger.fatal(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Marker marker, String message, Object... params) { - logger.fatal(marker, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Marker marker, String message, Throwable t) { - logger.fatal(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Message msg) { - logger.fatal(msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Message msg, Throwable t) { - logger.fatal(msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Object message) { - logger.fatal(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(Object message, Throwable t) { - logger.fatal(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(String message) { - logger.fatal(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(String message, Object... params) { - logger.fatal(message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void fatal(String message, Throwable t) { - logger.fatal(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public MessageFactory getMessageFactory() { - return logger.getMessageFactory(); - } - - /** - * {@inheritDoc} - */ - @Override - public String getName() { - return logger.getName(); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Marker marker, Message msg) { - logger.info(marker, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Marker marker, Message msg, Throwable t) { - logger.info(marker, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Marker marker, Object message) { - logger.info(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Marker marker, Object message, Throwable t) { - logger.info(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Marker marker, String message) { - logger.info(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Marker marker, String message, Object... params) { - logger.info(marker, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Marker marker, String message, Throwable t) { - logger.info(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Message msg) { - logger.info(msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Message msg, Throwable t) { - logger.info(msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Object message) { - logger.info(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(Object message, Throwable t) { - logger.info(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(String message) { - logger.info(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(String message, Object... params) { - logger.info(message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void info(String message, Throwable t) { - logger.info(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isDebugEnabled() { - return logger.isDebugEnabled(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isDebugEnabled(Marker marker) { - return logger.isDebugEnabled(marker); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isEnabled(Level level) { - return logger.isEnabled(level); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isEnabled(Level level, Marker marker) { - return logger.isEnabled(level, marker); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isErrorEnabled() { - return logger.isErrorEnabled(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isErrorEnabled(Marker marker) { - return logger.isErrorEnabled(marker); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isFatalEnabled() { - return logger.isFatalEnabled(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isFatalEnabled(Marker marker) { - return logger.isFatalEnabled(marker); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isInfoEnabled() { - return logger.isInfoEnabled(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isInfoEnabled(Marker marker) { - return logger.isInfoEnabled(marker); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isTraceEnabled() { - return logger.isTraceEnabled(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isTraceEnabled(Marker marker) { - return logger.isTraceEnabled(marker); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isWarnEnabled() { - return logger.isWarnEnabled(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isWarnEnabled(Marker marker) { - return logger.isWarnEnabled(marker); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Marker marker, Message msg) { - logger.log(level, marker, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Marker marker, Message msg, Throwable t) { - logger.log(level, marker, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Marker marker, Object message) { - logger.log(level, marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Marker marker, Object message, Throwable t) { - logger.log(level, marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Marker marker, String message) { - logger.log(level, marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Marker marker, String message, Object... params) { - logger.log(level, marker, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Marker marker, String message, Throwable t) { - logger.log(level, marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Message msg) { - logger.log(level, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Message msg, Throwable t) { - logger.log(level, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Object message) { - logger.log(level, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, Object message, Throwable t) { - logger.log(level, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, String message) { - logger.log(level, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, String message, Object... params) { - logger.log(level, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void log(Level level, String message, Throwable t) { - logger.log(level, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void printf(Level level, Marker marker, String format, Object... params) { - logger.printf(level, marker, format, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void printf(Level level, String format, Object... params) { - logger.printf(level, format, params); - } - - /** - * {@inheritDoc} - */ - @Override - public T throwing(Level level, T t) { - return logger.throwing(level, t); - } - - /** - * {@inheritDoc} - */ - @Override - public T throwing(T t) { - return logger.throwing(t); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Marker marker, Message msg) { - logger.trace(marker, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Marker marker, Message msg, Throwable t) { - logger.trace(marker, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Marker marker, Object message) { - logger.trace(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Marker marker, Object message, Throwable t) { - logger.trace(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Marker marker, String message) { - logger.trace(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Marker marker, String message, Object... params) { - logger.trace(marker, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Marker marker, String message, Throwable t) { - logger.trace(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Message msg) { - logger.trace(msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Message msg, Throwable t) { - logger.trace(msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Object message) { - logger.trace(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(Object message, Throwable t) { - logger.trace(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(String message) { - logger.trace(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(String message, Object... params) { - logger.trace(message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void trace(String message, Throwable t) { - logger.trace(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Marker marker, Message msg) { - logger.warn(marker, msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Marker marker, Message msg, Throwable t) { - logger.warn(marker, msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Marker marker, Object message) { - logger.warn(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Marker marker, Object message, Throwable t) { - logger.warn(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Marker marker, String message) { - logger.warn(marker, message); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Marker marker, String message, Object... params) { - logger.warn(marker, message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Marker marker, String message, Throwable t) { - logger.warn(marker, message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Message msg) { - logger.warn(msg); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Message msg, Throwable t) { - logger.warn(msg, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Object message) { - logger.warn(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(Object message, Throwable t) { - logger.warn(message, t); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(String message) { - logger.warn(message); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(String message, Object... params) { - logger.warn(message, params); - } - - /** - * {@inheritDoc} - */ - @Override - public void warn(String message, Throwable t) { - logger.warn(message, t); - } -} diff --git a/src/main/java/net/canarymod/plugin/Plugin.java b/src/main/java/net/canarymod/plugin/Plugin.java index a1f4790e..196eea01 100644 --- a/src/main/java/net/canarymod/plugin/Plugin.java +++ b/src/main/java/net/canarymod/plugin/Plugin.java @@ -6,11 +6,12 @@ import net.canarymod.commandsys.CommandListener; import net.canarymod.commandsys.CommandOwner; import net.canarymod.config.Configuration; -import net.canarymod.logger.Logman; import net.canarymod.motd.MOTDOwner; import net.canarymod.tasks.TaskOwner; import net.visualillusionsent.utils.LocaleHelper; import net.visualillusionsent.utils.PropertiesFile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.util.ArrayList; @@ -151,12 +152,12 @@ public String getPath() { } /** - * Gets the {@link Logman} for the Plugin + * Gets the {@link Logger} for the Plugin * - * @return the Plugin's {@link Logman} + * @return the Plugin's {@link Logger} */ - public Logman getLogman() { - return Logman.getLogman(getName()); + public Logger getLogger() { + return LoggerFactory.getLogger(getName()); } /** From 81f30c93216dc10078252059e5cd21ba2bee012f Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sun, 31 Dec 2017 01:26:14 +0000 Subject: [PATCH 12/12] Initial port to HikariCP --- build.gradle | 3 +- .../humanoid/npc/NPCBehaviorRegistry.java | 8 +- .../database/JdbcConnectionManager.java | 85 +++++++++---------- .../database/sqlite/SQLiteDatabase.java | 11 +-- .../canarymod/database/xml/XmlDatabase.java | 3 +- .../plugin/DefaultPluginManager.java | 6 +- .../net/canarymod/plugin/PluginManager.java | 2 +- 7 files changed, 57 insertions(+), 61 deletions(-) diff --git a/build.gradle b/build.gradle index 5e886415..70d3c8e8 100644 --- a/build.gradle +++ b/build.gradle @@ -34,6 +34,7 @@ repositories { dependencies { // Provided by Minecraft compile 'com.google.guava:guava:21.0' + compile 'com.google.code.gson:gson:2.8.0' compile 'com.mojang:authlib:1.5.25' // Logging @@ -42,7 +43,7 @@ dependencies { // Other compile 'net.visualillusionsent:viutils:1.4.2' compile 'org.jdom:jdom2:2.0.5' - compile 'com.mchange:c3p0:0.9.5' + compile 'com.zaxxer:HikariCP:2.7.4' compile 'com.googlecode.json-simple:json-simple:1.1.1' compile 'org.mcstats.standalone:metrics:R7' diff --git a/src/main/java/net/canarymod/api/entity/living/humanoid/npc/NPCBehaviorRegistry.java b/src/main/java/net/canarymod/api/entity/living/humanoid/npc/NPCBehaviorRegistry.java index 59001473..2f724417 100644 --- a/src/main/java/net/canarymod/api/entity/living/humanoid/npc/NPCBehaviorRegistry.java +++ b/src/main/java/net/canarymod/api/entity/living/humanoid/npc/NPCBehaviorRegistry.java @@ -1,5 +1,7 @@ package net.canarymod.api.entity.living.humanoid.npc; +import static net.canarymod.Canary.log; + import com.google.common.collect.ArrayListMultimap; import net.canarymod.ToolBox; import net.canarymod.api.entity.living.humanoid.NonPlayableCharacter; @@ -10,8 +12,6 @@ import java.util.Iterator; import java.util.List; -import static net.canarymod.Canary.log; - /** * @author Jason (darkdiplomat) */ @@ -21,7 +21,7 @@ public final class NPCBehaviorRegistry { /** * Registers a new {@link net.canarymod.api.entity.living.humanoid.npc.NPCBehaviorListener} * - * @param listner + * @param listener * the {@link net.canarymod.api.entity.living.humanoid.npc.NPCBehaviorListener} to be added * @param npc * the {@link net.canarymod.api.entity.living.humanoid.NonPlayableCharacter} associated with the listener @@ -167,7 +167,7 @@ public static void execute(NonPlayableCharacter npc, NPCAI npcai) { listener.execute(npcai); } catch (NPCAIExcutionException npcaieex) { - log.error(npcaieex.getCause()); + log.error("Failed to execute NPC AI", npcaieex); } } } diff --git a/src/main/java/net/canarymod/database/JdbcConnectionManager.java b/src/main/java/net/canarymod/database/JdbcConnectionManager.java index 6f779ff4..0ae913a0 100644 --- a/src/main/java/net/canarymod/database/JdbcConnectionManager.java +++ b/src/main/java/net/canarymod/database/JdbcConnectionManager.java @@ -1,17 +1,17 @@ package net.canarymod.database; -import com.mchange.v2.c3p0.ComboPooledDataSource; +import static net.canarymod.Canary.log; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; import net.canarymod.config.Configuration; import net.canarymod.config.DatabaseConfiguration; import net.canarymod.database.exceptions.DatabaseAccessException; -import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import static net.canarymod.Canary.log; - /** * Represents a connection (pool) manager for all sorts of JDBC connections. * In our particular case that is mysql and sqlite. @@ -21,10 +21,11 @@ * * @author Chris Ksoll (damagefilter) * @author Jason Jones (darkdiplomat) + * @author Jamie Mansfield (jamierocks) */ public class JdbcConnectionManager { - private ComboPooledDataSource cpds; // The data source pool ;) + private HikariDataSource dataSource; // The data source pool ;) private Connection nonManaged; // For those that bypass the manager/unable to use the manager private SQLType type; @@ -40,41 +41,43 @@ public class JdbcConnectionManager { */ private JdbcConnectionManager(SQLType type) throws SQLException { DatabaseConfiguration cfg = Configuration.getDbConfig(); - cpds = new ComboPooledDataSource(); this.type = type; if (type.usesJDBCManager()) { - try { - cpds.setDriverClass(type.getClassPath()); - cpds.setJdbcUrl(cfg.getDatabaseUrl(type.getIdentifier())); - cpds.setUser(cfg.getDatabaseUser()); - cpds.setPassword(cfg.getDatabasePassword()); - - // For settings explanations see - // http://javatech.org/2007/11/c3p0-connectionpool-configuration-rules-of-thumb/ - // https://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool?_sscc=t - - //connection pooling - cpds.setAcquireIncrement(cfg.getAcquireIncrement()); - cpds.setMaxIdleTime(cfg.getMaxConnectionIdleTime()); - cpds.setMaxIdleTimeExcessConnections(cfg.getMaxExcessConnectionsIdleTime()); - cpds.setMaxPoolSize(cfg.getMaxPoolSize()); - cpds.setMinPoolSize(cfg.getMinPoolSize()); - cpds.setNumHelperThreads(cfg.getNumHelperThreads()); - cpds.setUnreturnedConnectionTimeout(cfg.getReturnConnectionTimeout()); - cpds.setIdleConnectionTestPeriod(cfg.getConnectionTestFrequency()); - - //Statement pooling - cpds.setMaxStatements(cfg.getMaxCachedStatements()); - cpds.setMaxStatementsPerConnection(cfg.getMaxCachedStatementsPerConnection()); - cpds.setStatementCacheNumDeferredCloseThreads(cfg.getNumStatementCloseThreads()); + final HikariConfig config = new HikariConfig(); + + // Configure HikariConfig + { + config.setDriverClassName(type.getClassPath()); + config.setJdbcUrl(cfg.getDatabaseUrl(type.getIdentifier())); + config.setUsername(cfg.getDatabaseUser()); + config.setPassword(cfg.getDatabasePassword()); + + // getAcquireIncrement + config.setIdleTimeout(cfg.getMaxConnectionIdleTime()); + // getMaxExcessConnectionsIdleTime + config.setMaximumPoolSize(cfg.getMaxPoolSize()); + // getMinPoolSize + // getNumHelperThreads + // getReturnConnectionTimeout + // getConnectionTestFrequency + + // getMaxCachedStatements + // getMaxCachedStatementsPerConnection + // getNumStatementCloseThreads } - catch (PropertyVetoException e) { - log.error("Failed to configure the connection pool!", e); + + // Create the HikariDataSource + this.dataSource = new HikariDataSource(config); + + // Test connection + { + try (final Connection c = this.dataSource.getConnection()) { + // noop + } + catch (final SQLException ex) { + throw new RuntimeException("Failed to test the connection!", ex); + } } - //Test connection... - //If this fails it throws an SQLException so we're notified - Connection c = cpds.getConnection(); - c.close(); } else { nonManaged = DriverManager.getConnection(cfg.getDatabaseUrl(type.getIdentifier()), cfg.getDatabaseUser(), cfg.getDatabasePassword()); @@ -132,13 +135,9 @@ public static Connection getConnection() { cman.nonManaged = DriverManager.getConnection(cfg.getDatabaseUrl(cman.type.getIdentifier()), cfg.getDatabaseUser(), cfg.getDatabasePassword()); return cman.nonManaged; } - return cman.cpds.getConnection(); - } - catch (SQLException e) { - log.error("Couldn't get a Connection from pool!", e); - return null; + return cman.dataSource.getConnection(); } - catch (DatabaseAccessException e) { + catch (SQLException | DatabaseAccessException e) { log.error("Couldn't get a Connection from pool!", e); return null; } @@ -153,7 +152,7 @@ public static void shutdown() { // already shut down or never instantiated (perhaps because we're running on a non-jdbc database) return; } - instance.cpds.close(); + instance.dataSource.close(); if (instance.nonManaged != null) { try { instance.nonManaged.close(); diff --git a/src/main/java/net/canarymod/database/sqlite/SQLiteDatabase.java b/src/main/java/net/canarymod/database/sqlite/SQLiteDatabase.java index e96da30f..f0afbe2f 100644 --- a/src/main/java/net/canarymod/database/sqlite/SQLiteDatabase.java +++ b/src/main/java/net/canarymod/database/sqlite/SQLiteDatabase.java @@ -1,5 +1,7 @@ package net.canarymod.database.sqlite; +import static net.canarymod.Canary.log; + import net.canarymod.Canary; import net.canarymod.database.Column; import net.canarymod.database.Column.DataType; @@ -28,8 +30,6 @@ import java.util.List; import java.util.Map; -import static net.canarymod.Canary.log; - /** * SQLite Database * @@ -90,12 +90,9 @@ public void insert(DataAccess data) throws DatabaseWriteException { throw new DatabaseWriteException("Error inserting SQLite: no rows updated!"); } } - catch (SQLException ex) { + catch (SQLException | DatabaseTableInconsistencyException ex) { log.error(ex.getMessage(), ex); } - catch (DatabaseTableInconsistencyException dtie) { - log.error(dtie.getMessage(), dtie); - } finally { close(null, ps, null); } @@ -468,7 +465,7 @@ public void retainColumns(DataAccess table, List toRetain) throws Databa concatColumns.append(column); } - log.debug(concatColumns); + log.debug(concatColumns.toString()); String tableName = table.getName(); String tempTable = "" + tableName + "_temp"; diff --git a/src/main/java/net/canarymod/database/xml/XmlDatabase.java b/src/main/java/net/canarymod/database/xml/XmlDatabase.java index 443a1dca..3b9ca6f3 100644 --- a/src/main/java/net/canarymod/database/xml/XmlDatabase.java +++ b/src/main/java/net/canarymod/database/xml/XmlDatabase.java @@ -2,7 +2,6 @@ import com.google.common.collect.Maps; import com.google.common.io.Files; -import com.mchange.v1.lang.BooleanUtils; import net.canarymod.Canary; import net.canarymod.database.Column; import net.canarymod.database.Column.DataType; @@ -1025,7 +1024,7 @@ private Comparable typeParse(String value, String field, DataType type, DataAcce return defValTempl.getClass().getField(field).getDouble(defValTempl); } case BOOLEAN: - return BooleanUtils.parseBoolean(value); + return Boolean.parseBoolean(value); case STRING: default: return value; diff --git a/src/main/java/net/canarymod/plugin/DefaultPluginManager.java b/src/main/java/net/canarymod/plugin/DefaultPluginManager.java index 6a1511be..bdf60b24 100644 --- a/src/main/java/net/canarymod/plugin/DefaultPluginManager.java +++ b/src/main/java/net/canarymod/plugin/DefaultPluginManager.java @@ -1,5 +1,7 @@ package net.canarymod.plugin; +import static net.canarymod.Canary.log; + import net.canarymod.Canary; import net.canarymod.config.Configuration; import net.canarymod.exceptions.InvalidPluginException; @@ -8,7 +10,7 @@ import net.canarymod.hook.system.PluginEnableHook; import net.canarymod.plugin.dependencies.DependencyGraph; import net.visualillusionsent.utils.PropertiesFile; -import org.apache.logging.log4j.Logger; +import org.slf4j.Logger; import java.io.File; import java.io.FileFilter; @@ -20,8 +22,6 @@ import java.util.Map; import java.util.Set; -import static net.canarymod.Canary.log; - /** * {@inheritDoc} * diff --git a/src/main/java/net/canarymod/plugin/PluginManager.java b/src/main/java/net/canarymod/plugin/PluginManager.java index b56c0466..1f27b830 100644 --- a/src/main/java/net/canarymod/plugin/PluginManager.java +++ b/src/main/java/net/canarymod/plugin/PluginManager.java @@ -2,7 +2,7 @@ import net.canarymod.exceptions.InvalidPluginException; import net.canarymod.exceptions.PluginLoadFailedException; -import org.apache.logging.log4j.Logger; +import org.slf4j.Logger; import java.util.Collection;