text:
Q: Writing Complex Equations in HTML? Is there a way to write equations like the one I wrote here? Without manually
writing all the 1 height symbols? like
I want to Visualize Simplify [{(-6^7)^8*[(21/1)/(22/1)]}^7]^9 In equation form like here: symbolab
but like is there an HTML or Javascript method of automatically writing out complex equations like this?

redpajama_set_name: RedPajamaStackExchange


text:
package com.github.tommyettinger.demos;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.IntMap;
import com.badlogic.gdx.utils.TimeUtils;
import com.badlogic.gdx.utils.viewport.FillViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import squidpony.ArrayTools;
import squidpony.FakeLanguageGen;
import squidpony.squidai.DijkstraMap;
import squidpony.squidgrid.FOV;
import squidpony.squidgrid.Measurement;
import squidpony.squidgrid.Radius;
import squidpony.squidgrid.mapping.DungeonGenerator;
import squidpony.squidgrid.mapping.DungeonUtility;
import squidpony.squidmath.Coord;
import squidpony.squidmath.GWTRNG;
import squidpony.squidmath.GreasedRegion;
import squidpony.squidmath.OrderedMap;

import java.util.ArrayList;
import java.util.List;

import static com.badlogic.gdx.Input.Keys.*;

/**
 */
public class DawnlikeDemo extends ApplicationAdapter {
    private static final float DURATION = 0.375f;
    private long startTime;
    private enum Phase {WAIT, PLAYER_ANIM, MONSTER_ANIM}
    private SpriteBatch batch, simpleBatch, contrastBatch;
    private ShaderProgram shader;
    private Phase phase = Phase.WAIT;
    private long animationStart;

    // random number generator, optimized for when you build for the web browser (with GWT)
    private GWTRNG rng;

    // Stores all images we use here efficiently, as well as the font image
    private TextureAtlas atlas;
    // This maps chars, such as '#', to specific images, such as a pillar.
    private IntMap<TextureAtlas.AtlasRegion> charMapping;

    private DungeonGenerator dungeonGen;
    private char[][] decoDungeon, bareDungeon, lineDungeon;
    // these use packed float colors, which avoid the overhead of creating new Color objects
    private float[][] colors, bgColors;
    private Coord player;
    private final int fovRange = 8;
    private Vector3 pos = new Vector3();

    //Here, gridHeight refers to the total number of rows to be displayed on the screen.
    //We're displaying 32 rows of dungeon, then 1 more row of player stats, like current health.
    //gridHeight is 32 because that variable will be used for generating the dungeon (the actual size of the dungeon
    //will be double gridWidth and double gridHeight), and determines how much off the dungeon is visible at any time.
    //The bonusHeight is the number of additional rows that aren't handled like the dungeon rows and are shown in a
    //separate area; here we use one row for player stats. The gridWidth is 48, which means we show 48 grid spaces
    //across the whole screen, but the actual dungeon is larger. The cellWidth and cellHeight are each 16, which will
    //match the starting dimensions of a cell in pixels, but won't be stuck at that value because a PixelPerfectViewport
    //is used and will increase the cell size in multiples of 16 when the window is resized. While gridWidth and
    //gridHeight are measured in spaces on the grid, cellWidth and cellHeight are the initial pixel dimensions of one
    //cell; resizing the window can make the units cellWidth and cellHeight use smaller or larger than a pixel.

    /** In number of cells */
    public static final int gridWidth = 48;
    /** In number of cells */
    public static final int gridHeight = 32;

    /** In number of cells */
    public static final int bigWidth = gridWidth * 2;
    /** In number of cells */
    public static final int bigHeight = gridHeight * 2;

//    /** In number of cells */
//    public static final int bonusHeight = 0;
    /** The pixel width of a cell */
    public static final int cellWidth = 16;
    /** The pixel height of a cell */
    public static final int cellHeight = 16;

    private boolean onGrid(int screenX, int screenY)
    {
        return screenX >= 0 && screenX < bigWidth && screenY >= 0 && screenY < bigHeight;
    }

    private InputProcessor input;
    private long lastDrawTime = 0;
    private Color bgColor;
    private BitmapFont font;
    private Viewport mainViewport;
    private Camera camera;

    private OrderedMap<Coord, AnimatedGlider> monsters;
    private DijkstraMap getToPlayer, playerToCursor;
    private Coord cursor;
    private List<Coord> toCursor;
    private List<Coord> awaitedMoves;
    private String lang;
    private double[][] resistance;
    private double[][] visible;
    private TextureAtlas.AtlasRegion solid;
    private int health = 9;

    // GreasedRegion is a hard-to-explain class, but it's an incredibly useful one for map generation and many other
    // tasks; it stores a region of "on" cells where everything not in that region is considered "off," and can be used
    // as a Collection of Coord points. However, it's more than that! Because of how it is implemented, it can perform
    // bulk operations on as many as 64 points at a time, and can efficiently do things like expanding the "on" area to
    // cover adjacent cells that were "off", retracting the "on" area away from "off" cells to shrink it, getting the
    // surface ("on" cells that are adjacent to "off" cells) or fringe ("off" cells that are adjacent to "on" cells),
    // and generally useful things like picking a random point from all "on" cells.
    // Here, we use a GreasedRegion to store all floors that the player can walk on, a small rim of cells just beyond
    // the player's vision that blocks pathfinding to areas we can't see a path to, and we also store all cells that we
    // have seen in the past in a GreasedRegion (in most roguelikes, there would be one of these per dungeon floor).
    private GreasedRegion floors, blockage, seen;
    private AnimatedGlider playerSprite;
    // libGDX can use a kind of packed float (yes, the number type) to efficiently store colors, but it also uses a
    // heavier-weight Color object sometimes; SquidLib has a large list of SColor objects that are often used as easy
    // predefined colors since SColor extends Color. SparseLayers makes heavy use of packed float colors internally,
    // but also allows Colors instead for most methods that take a packed float. Some cases, like very briefly-used
    // colors that are some mix of two other colors, are much better to create as packed floats from other packed
    // floats, usually using SColor.lerpFloatColors(), which avoids creating any objects. It's ideal to avoid creating
    // new objects (such as Colors) frequently for only brief usage, because this can cause temporary garbage objects to
    // build up and slow down the program while they get cleaned up (garbage collection, which is slower on Android).
    // Recent versions of SquidLib include the packed float literal in the JavaDocs for any SColor, along with previews
    // of that SColor as a background and foreground when used with other colors, plus more info like the hue,
    // saturation, and value of the color. Here we just use the packed floats directly from the SColor docs, but we also
    // mention what color it is in a line comment, which is a good habit so you can see a preview if needed.
    // The format used for the floats is a hex literal; these are explained at the bottom of this file, in case you
    // aren't familiar with them (they're a rather obscure feature of Java 5 and newer).
    private static final float
            FLOAT_WHITE = Color.WHITE.toFloatBits(),
            FLOAT_BLACK = Color.BLACK.toFloatBits(),
            FLOAT_BLOOD = -0x1.564f86p125F,  // same result as SColor.PURE_CRIMSON.toFloatBits()
            FLOAT_LIGHTING = ColorTools.floatGetHSV(0.17f, 0.0625f, 0.875f, 1f),
//            FLOAT_LIGHTING = ColorTools.floatGetHSV(0.17f, 0.12f, 0.8f, 1f),
// -0x1.cff1fep126F, // same result as SColor.COSMIC_LATTE.toFloatBits()
            FLOAT_GRAY = ColorTools.floatGetHSV(0f, 0f, 0.25f, 1f);
                    //-0x1.7e7e7ep125F; // same result as SColor.CW_GRAY_BLACK.toFloatBits()
    // the player's color as a float
//    private float playerColor;
    @Override
    public void create () {
        // Starting time for the game; other times are measured relative to this so they aren't huge numbers.
        startTime = TimeUtils.millis();
        // Gotta have a random number generator.
        // We can seed a GWTRNG, which is optimized for the HTML target, with any int or long
        // we want. You can also hash a String with CrossHash.hash64("Some seed") to get a
        // random-seeming long to use for a seed. CrossHash is preferred over String.hashCode()
        // because it can produce 64-bit seeds and String.hashCode() will only produce 32-bit
        // seeds; having more possible seeds means more maps and other procedural content
        // become possible. Here we don't seed the GWTRNG, so its seed will be random.
        rng = new GWTRNG();

        final String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
            + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n"
            + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n"
            + "uniform mat4 u_projTrans;\n"
            + "varying vec4 v_color;\n"
            + "varying vec2 v_texCoords;\n"
            + "\n"
            + "void main()\n"
            + "{\n"
            + "   v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n"
            + "   v_color.a = v_color.a * (255.0/254.0);\n"
            + "   v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n"
            + "   gl_Position =  u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
            + "}\n";

        final String fragmentShader = Gdx.files.internal("xbrz-freescale.frag.glsl").readString("UTF8");
        shader = new ShaderProgram(vertexShader, fragmentShader);
        if(!shader.isCompiled())
            System.out.println(shader.getLog());
        contrastBatch = new SpriteBatch(1000, shader);
        simpleBatch = new SpriteBatch();
        batch = contrastBatch;
        animationStart = TimeUtils.millis();
//        mainViewport = new PixelPerfectViewport(Scaling.fill, gridWidth * cellWidth, gridHeight * cellHeight);
        mainViewport = new FillViewport(gridWidth * cellWidth, gridHeight * cellHeight);
        mainViewport.setScreenBounds(0, 0, gridWidth * cellWidth, gridHeight * cellHeight);
        camera = mainViewport.getCamera();
        camera.update();

        atlas = new TextureAtlas("Dawnlike.atlas");
        font = new BitmapFont(Gdx.files.internal("font.fnt"), atlas.findRegion("font"));
        font.setUseIntegerPositions(false);
        font.getData().markupEnabled = true;
        bgColors = ArrayTools.fill(FLOAT_BLACK, bigWidth, bigHeight);
        colors = ArrayTools.fill(FLOAT_WHITE, bigWidth, bigHeight);
        solid = atlas.findRegion("pixel");
        String[] possibleCharacters = {
                "ordinary human",
                "fighter",
                "ranger",
                "bandit",
                "valkyrie",
                "slayer",
                "wizard",
                "monk",
                "priest",
                "aide",
                "samurai",
                "collector",
                "brute",
                "nomad",
                "tourist",
                "convict",
                "man",
                "knight",
                "yeoman",
                "thief",
                "champion",
                "exterminator",
                "archmage",
                "sensei",
                "bishop",
                "healer",
                "ninja",
                "archaeologist",
                "barbarian",
                "caveman",
                "sightseer",
                "desperado",
                "ordinary woman",
                "priestess",
                "cavewoman",
        }, possibleEnemies = {
                "frog",
                "baby plains chickabay",
                "plains chickabay",
                "baby fen chickabay",
                "fen chickabay",
                "baby taiga chickabay",
                "taiga chickabay",
                "baby doom chickabay",
                "doom chickabay",
                "baby nighthawk",
                "nighthawk",
                "baby cave swift",
                "cave swift",
                "baby arctic tern",
                "arctic tern",
                "baby robin",
                "robin",
                "baby osprey",
                "osprey",
                "baby phoenix",
                "phoenix",
                "baby aluminum falcon",
                "aluminum falcon",
                "baby cave penguin",
                "cave penguin",
                "baby penguin",
                "penguin",
                "baby pelican",
                "pelican",
                "baby duck",
                "duck",
                "baby puffin",
                "puffin",
                "baby swan",
                "swan",
                "baby albatross",
                "albatross",
                "baby condor",
                "condor",
                "baby green parrot",
                "green parrot",
                "baby dove",
                "dove",
                "baby parakeet",
                "parakeet",
                "baby thrush",
                "thrush",
                "baby cormorant",
                "cormorant",
                "baby seagull",
                "seagull",
                "baby bald eagle",
                "bald eagle",
                "golden eagle",
                "baby golden eagle",
                "baby ostrich",
                "ostrich",
                "baby emu",
                "emu",
                "baby kiwi",
                "kiwi",
                "chick",
                "hen",
                "rooster",
                "baby peacock",
                "peahen",
                "peacock",
                "baby griffon",
                "griffon",
                "baby snow griffon",
                "snow griffon",
                "baby barn owl",
                "barn owl",
                "baby snowy owl",
                "snowy owl",
                "white nosed bat",
                "giant bat",
                "vampire bat",
                "werebat",
                "baby bat",
                "baby gray parrot",
                "gray parrot",
                "bobcat",
                "leopard",
                "panther",
                "tiger",
                "lion",
                "puma kitten",
                "puma",
                "fierce puma",
                "lynx kitten",
                "lynx",
                "fierce lynx",
                "barn kitten",
                "barn cat",
                "fierce barn cat",
                "weretiger",
                "werecat",
                "barbed devil",
                "marilith",
                "vrock",
                "lava demon",
                "juiblex",
                "yeenoghu",
                "orcus",
                "geryon",
                "sandestin",
                "lesser devil",
                "pit fiend",
                "nalzok",
                "ixoth",
                "minion of huhetotl",
                "water demon",
                "mail daemon",
                "asmodeus",
                "baalzebub",
                "dispater",
                "erinys",
                "demogorgon",
                "cthulhu",
                "balrog",
                "bone devil",
                "ice devil",
                "horned devil",
                "homunculus",
                "manes",
                "lemure",
                "imp",
                "quasit",
                "succubus",
                "incubus",
                "derro slaver",
                "derro brute",
                "nalfeshnee",
                "hezrou",
                "jackal",
                "fox",
                "dingo",
                "coyote",
                "rabid jackal",
                "werejackal",
                "wolf",
                "warg",
                "baby winter wolf",
                "winter wolf",
                "rabid wolf",
                "werewolf",
                "little hound",
                "hound",
                "big hound",
                "little cogdog",
                "cogdog",
                "big cogdog",
                "little terrier",
                "terrier",
                "big terrier",
                "heck puppy",
                "hell hound",
                "cerberus",
                "straw golem",
                "paper golem",
                "wax golem",
                "rope golem",
                "gold golem",
                "leather golem",
                "wood golem",
                "flesh golem",
                "clay golem",
                "stone golem",
                "glass golem",
                "iron golem",
                "snow golem",
                "crystal golem",
                "fog cloud",
                "dust vortex",
                "ice vortex",
                "energy vortex",
                "steam vortex",
                "fire vortex",
                "stalker",
                "air elemental",
                "fire elemental",
                "earth elemental",
                "water elemental",
                "gas spore",
                "freezing sphere",
                "flaming sphere",
                "shocking sphere",
                "floating eye",
                "evil eye",
                "eye tyrant",
                "rock piercer",
                "iron piercer",
                "glass piercer",
                "small mimic",
                "large mimic",
                "giant mimic",
                "strange object",
                "xorn",
                "invisible creature",
                "lurker above",
                "lurker below",
                "yellow light",
                "black light",
                "giant",
                "stone giant",
                "hill giant",
                "fire giant",
                "frost giant",
                "storm giant",
                "ettin",
                "titan",
                "minotaur",
                "cyclops",
                "surtur",
                "keystone kop",
                "kop sergeant",
                "kop lieutenant",
                "kop kaptain",
                "shopkeeper",
                "executioner",
                "assassin",
                "prisoner",
                "forest sprite",
                "forest fairy",
                "forest spirit",
                "mountain sprite",
                "mountain fairy",
                "mountain spirit",
                "green wings",
                "gold wings",
                "orc",
                "hill orc",
                "deep orc",
                "militant orc",
                "orc shaman",
                "orc king",
                "uruk",
                "soldier",
                "sergeant",
                "lieutenant",
                "captain",
                "watchman",
                "watch captain",
                "guard",
                "elf",
                "wood elf",
                "green elf",
                "gray elf",
                "elf lord",
                "elf king",
                "troll",
                "ice troll",
                "rock troll",
                "water troll",
                "olog hai",
                "gnome",
                "gnome lord",
                "gnome wizard",
                "gnome king",
                "leprechaun",
                "peasant man",
                "peasant woman",
                "farmer man",
                "farmer woman",
                "miner",
                "hobbit",
                "dwarf",
                "dwarf lord",
                "dwarf king",
                "wood nymph",
                "water nymph",
                "mountain nymph",
                "fire nymph",
                "quest leader a",
                "quest leader b",
                "quest leader c",
                "quest leader d",
                "satyr",
                "plains centaur",
                "forest centaur",
                "mountain centaur",
                "ogre",
                "ogre lord",
                "ogre king",
                "quantum mechanic",
                "croesus",
                "angel",
                "dark angel",
                "archon",
                "weeping angel",
                "weeping archangel",
                "tengu",
                "djinn",
                "marid",
                "dao",
                "goblin",
                "hobgoblin",
                "goblin king",
                "mind flayer",
                "master mind flayer",
                "bugbear",
                "yeti",
                "oracle",
                "nurse",
                "aligned priest",
                "high priest",
                "ocean spirit",
                "river spirit",
                "snow puff",
                "sand puff",
                "medusa",
                "rodent of unusual size",
                "ratzilla",
                "snowy owlbear",
                "owlbear",
                "spriggan",
                "pegasus",
                "kirin",
                "gremlin",
                "gargoyle",
                "winged gargoyle",
                "uranium imp",
                "kobold",
                "large kobold",
                "kobold shaman",
                "kobold lord",
                "monkey",
                "ape",
                "carnivorous ape",
                "jabberwock",
                "vorpal jabberwock",
                "umber hulk",
                "water hulk",
                "big hallucination",
                "small hallucination",
                "baby terror bird",
                "terror bird",
                "zruty",
                "giant tick",
                "giant flea",
                "giant louse",
                "giant beetle",
                "larva",
                "maggot",
                "dung worm",
                "tunnel worm",
                "walking stick",
                "dragonfly",
                "bee grub",
                "queen bee",
                "tsetse fly",
                "killer bee",
                "cave spider",
                "giant spider",
                "shelob",
                "scorpion",
                "giant scorpion",
                "scorpius",
                "baby long worm",
                "long worm",
                "long worm tail",
                "baby purple worm",
                "purple worm",
                "giant ant",
                "soldier ant",
                "fire ant",
                "snow ant",
                "firefly",
                "locust",
                "assassin bug",
                "grid bug",
                "xan",
                "chillbug",
                "baby slug",
                "giant slug",
                "baby snail",
                "giant snail",
                "spark bug",
                "arc bug",
                "phase spider",
                "centipede",
                "spitting beetle",
                "killer beetle",
                "evil shrub",
                "burning evil shrub",
                "demon shrub",
                "burning demon shrub",
                "blizzard shrub",
                "withered blizzard shrub",
                "maelstrom shrub",
                "withered maelstrom shrub",
                "evil tree",
                "burning evil tree",
                "demon tree",
                "burning demon tree",
                "blizzard tree",
                "withered blizzard tree",
                "maelstrom tree",
                "withered maelstrom tree",
                "dungeon fern",
                "dungeon fern sprout",
                "dungeon fern spore",
                "arctic fern",
                "arctic fern sprout",
                "arctic fern spore",
                "blazing fern",
                "blazing fern sprout",
                "blazing fern spore",
                "swamp fern",
                "swamp fern sprout",
                "swamp fern spore",
                "devil snare",
                "mould",
                "ungenomold",
                "shrieker",
                "baby pig",
                "pig",
                "baby hog",
                "hog",
                "feral hog",
                "baby black boar",
                "black boar",
                "vicious black boar",
                "baby dairy cow",
                "dairy cow",
                "baby bull",
                "bull",
                "raging bull",
                "camel",
                "llama",
                "baby white goat",
                "white goat",
                "baby gray goat",
                "gray goat",
                "baby black goat",
                "black goat",
                "baby white sheep",
                "white sheep",
                "baby gray sheep",
                "gray sheep",
                "baby black sheep",
                "black sheep",
                "brown unicorn",
                "white unicorn",
                "gray unicorn",
                "black unicorn",
                "newborn brown horse",
                "baby brown horse",
                "brown horse",
                "strong brown horse",
                "baby gray horse",
                "gray horse",
                "strong gray horse",
                "baby black horse",
                "black horse",
                "strong black horse",
                "baby deer",
                "deer",
                "mastodon",
                "mumak",
                "titanothere",
                "baluchitherium",
                "wumpus",
                "leocrotta",
                "baby sphinx",
                "sphinx",
                "baby wyvern",
                "wyvern",
                "baby dreadwyrm",
                "dreadwyrm",
                "baby glendrake",
                "glendrake",
                "baby firedrake",
                "firedrake",
                "baby icewyrm",
                "icewyrm",
                "baby sanddrake",
                "sanddrake",
                "baby stormwyrm",
                "storrmwyrm",
                "baby darkwyrm",
                "darkwyrm",
                "baby lightwyrm",
                "lightwyrm",
                "baby bogwyrm",
                "bogwyrm",
                "baby sheenwyrm",
                "sheenwyrm",
                "baby kingwyrm",
                "kingwyrm",
                "baby searwyrm",
                "searwyrm",
                "hydra",
                "baby hydra",
                "garter snake",
                "snake",
                "python",
                "water moccasin",
                "pit viper",
                "cobra",
                "asp",
                "serpent",
                "baby red naga",
                "red naga",
                "baby black naga",
                "black naga",
                "baby golden naga",
                "golden naga",
                "baby white naga",
                "white naga",
                "baby guardian naga",
                "guardian naga",
                "baby cockatrice",
                "cockatrice",
                "baby pyrolisk",
                "pyrolisk",
                "lizard",
                "iguana",
                "chameleon",
                "baby crocodile",
                "crocodile",
                "gecko",
                "komodo dragon",
                "gila monster",
                "newt",
                "giant turtle",
                "giant tortoise",
                "salamander",
                "red squirrel",
                "gray squirrel",
                "rabbit",
                "jackrabbit",
                "woodchuck",
                "sewer rat",
                "giant rat",
                "rabid rat",
                "enormous rat",
                "disintegrator",
                "rust monster",
                "rock mole",
                "wererat",
                "gray ooze",
                "brown pudding",
                "black pudding",
                "acid blob",
                "quivering blob",
                "gelatinous cube",
                "blue jelly",
                "spotted jelly",
                "ochre jelly",
                "green slime",
                "blue slime",
                "kobold zombie",
                "gnome zombie",
                "orc zombie",
                "dwarf zombie",
                "elf zombie",
                "human zombie",
                "ettin zombie",
                "giant zombie",
                "kobold mummy",
                "gnome mummy",
                "orc mummy",
                "dwarf mummy",
                "elf mummy",
                "human mummy",
                "ettin mummy",
                "giant mummy",
                "skeleton",
                "fire skeleton",
                "plague skeleton",
                "shadow skeleton",
                "lich",
                "demilich",
                "master lich",
                "archlich",
                "vampire",
                "vampire lord",
                "vampire mage",
                "vlad the impaler",
                "wisp",
                "spirit",
                "ghost",
                "shade",
                "death",
                "pestilence",
                "famine",
                "wraith",
                "nazgul",
                "barrow wight",
                "charon",
                "wizard of yendor",
                "war",
                "ghoul",
                "dark one",
                "meathead",
                "small meathead",
        };
        charMapping = new IntMap<>(64);

        charMapping.put('.', atlas.findRegion("day tile floor c"));
        charMapping.put(',', atlas.findRegion("brick clear pool center"      ));
        charMapping.put('~', atlas.findRegion("brick murky pool center"      ));
        charMapping.put('"', atlas.findRegion("dusk grass floor c"      ));
        charMapping.put('#', atlas.findRegion("lit brick wall center"     ));
        charMapping.put('+', atlas.findRegion("closed wooden door front")); //front
        charMapping.put('/', atlas.findRegion("open wooden door side"  )); //side
        charMapping.put('└', atlas.findRegion("lit brick wall right down"            ));
        charMapping.put('┌', atlas.findRegion("lit brick wall right up"            ));
        charMapping.put('┬', atlas.findRegion("lit brick wall left right up"           ));
        charMapping.put('┴', atlas.findRegion("lit brick wall left right down"           ));
        charMapping.put('─', atlas.findRegion("lit brick wall left right"            ));
        charMapping.put('│', atlas.findRegion("lit brick wall up down"            ));
        charMapping.put('├', atlas.findRegion("lit brick wall right up down"           ));
        charMapping.put('┼', atlas.findRegion("lit brick wall left right up down"          ));
        charMapping.put('┤', atlas.findRegion("lit brick wall left up down"           ));
        charMapping.put('┐', atlas.findRegion("lit brick wall left up"            ));
        charMapping.put('┘', atlas.findRegion("lit brick wall left down"            ));
        //This uses the seeded RNG we made earlier to build a procedural dungeon using a method that takes rectangular
        //sections of pre-drawn dungeon and drops them into place in a tiling pattern. It makes good winding dungeons
        //with rooms by default, but in the later call to dungeonGen.generate(), you can use a TilesetType such as
        //TilesetType.ROUND_ROOMS_DIAGONAL_CORRIDORS or TilesetType.CAVES_LIMIT_CONNECTIVITY to change the sections that
        //this will use, or just pass in a full 2D char array produced from some other generator, such as
        //SerpentMapGenerator, OrganicMapGenerator, or DenseRoomMapGenerator.
        dungeonGen = new DungeonGenerator(bigWidth, bigHeight, rng);
        //uncomment this next line to randomly add water to the dungeon in pools.
        dungeonGen.addWater(12);
        dungeonGen.addDoors(10, true);
        dungeonGen.addGrass(10);
        //decoDungeon is given the dungeon with any decorations we specified. (Here, we didn't, unless you chose to add
        //water to the dungeon. In that case, decoDungeon will have different contents than bareDungeon, next.)
        decoDungeon = dungeonGen.generate();
        //getBareDungeon provides the simplest representation of the generated dungeon -- '#' for walls, '.' for floors.
        bareDungeon = dungeonGen.getBareDungeon();
        //When we draw, we may want to use a nicer representation of walls. DungeonUtility has lots of useful methods
        //for modifying char[][] dungeon grids, and this one takes each '#' and replaces it with a box-drawing char.
        //The end result looks something like this, for a smaller 60x30 map:
        //
        // ┌───┐┌──────┬──────┐┌──┬─────┐   ┌──┐    ┌──────────┬─────┐
        // │...││......│......└┘..│.....│   │..├───┐│..........│.....└┐
        // │...││......│..........├──┐..├───┤..│...└┴────......├┐.....│
        // │...││.................│┌─┘..│...│..│...............││.....│
        // │...││...........┌─────┘│....│...│..│...........┌───┴┴───..│
        // │...│└─┐....┌───┬┘      │........│..│......─────┤..........│
        // │...└─┐│....│...│       │.......................│..........│
        // │.....││........└─┐     │....│..................│.....┌────┘
        // │.....││..........│     │....├─┬───────┬─┐......│.....│
        // └┬──..└┼───┐......│   ┌─┴─..┌┘ │.......│ │.....┌┴──┐..│
        //  │.....│  ┌┴─..───┴───┘.....└┐ │.......│┌┘.....└─┐ │..│
        //  │.....└──┘..................└─┤.......││........│ │..│
        //  │.............................│.......├┘........│ │..│
        //  │.............┌──────┐........│.......│...─┐....│ │..│
        //  │...........┌─┘      └──┐.....│..─────┘....│....│ │..│
        // ┌┴─────......└─┐      ┌──┘..................│..──┴─┘..└─┐
        // │..............└──────┘.....................│...........│
        // │............................┌─┐.......│....│...........│
        // │..│..│..┌┐..................│ │.......├────┤..──┬───┐..│
        // │..│..│..│└┬──..─┬───┐......┌┘ └┐.....┌┘┌───┤....│   │..│
        // │..├──┤..│ │.....│   │......├───┘.....│ │...│....│┌──┘..└──┐
        // │..│┌─┘..└┐└┬─..─┤   │......│.........└─┘...│....││........│
        // │..││.....│ │....│   │......│...............│....││........│
        // │..││.....│ │....│   │......│..┌──┐.........├────┘│..│.....│
        // ├──┴┤...│.└─┴─..┌┘   └┐....┌┤..│  │.....│...└─────┘..│.....│
        // │...│...│.......└─────┴─..─┴┘..├──┘.....│............└─────┤
        // │...│...│......................│........│..................│
        // │.......├───┐..................│.......┌┤.......┌─┐........│
        // │.......│   └──┐..┌────┐..┌────┤..┌────┘│.......│ │..┌──┐..│
        // └───────┘      └──┘    └──┘    └──┘     └───────┘ └──┘  └──┘
        //this is also good to compare against if the map looks incorrect, and you need an example of a correct map when
        //no parameters are given to generate().
        lineDungeon = DungeonUtility.hashesToLines(decoDungeon);

        resistance = DungeonUtility.generateSimpleResistances(decoDungeon);
        visible = new double[bigWidth][bigHeight];

        //Coord is the type we use as a general 2D point, usually in a dungeon.
        //Because we know dungeons won't be incredibly huge, Coord performs best for x and y values less than 256, but
        // by default it can also handle some negative x and y values (-3 is the lowest it can efficiently store). You
        // can call Coord.expandPool() or Coord.expandPoolTo() if you need larger maps to be just as fast.
        cursor = Coord.get(-1, -1);
        // here, we need to get a random floor cell to place the player upon, without the possibility of putting him
        // inside a wall. There are a few ways to do this in SquidLib. The most straightforward way is to randomly
        // choose x and y positions until a floor is found, but particularly on dungeons with few floor cells, this can
        // have serious problems -- if it takes too long to find a floor cell, either it needs to be able to figure out
        // that random choice isn't working and instead choose the first it finds in simple iteration, or potentially
        // keep trying forever on an all-wall map. There are better ways! These involve using a kind of specific storage
        // for points or regions, getting that to store only floors, and finding a random cell from that collection of
        // floors. The two kinds of such storage used commonly in SquidLib are the "packed data" as short[] produced by
        // CoordPacker (which use very little memory, but can be slow, and are treated as unchanging by CoordPacker so
        // any change makes a new array), and GreasedRegion objects (which use slightly more memory, tend to be faster
        // on almost all operations compared to the same operations with CoordPacker, and default to changing the
        // GreasedRegion object when you call a method on it instead of making a new one). Even though CoordPacker
        // sometimes has better documentation, GreasedRegion is generally a better choice; it was added to address
        // shortcomings in CoordPacker, particularly for speed, and the worst-case scenarios for data in CoordPacker are
        // no problem whatsoever for GreasedRegion. CoordPacker is called that because it compresses the information
        // for nearby Coords into a smaller amount of memory. GreasedRegion is called that because it encodes regions,
        // but is "greasy" both in the fatty-food sense of using more space, and in the "greased lightning" sense of
        // being especially fast. Both of them can be seen as storing regions of points in 2D space as "on" and "off."

        // Here we fill a GreasedRegion so it stores the cells that contain a floor, the '.' char, as "on."
        floors = new GreasedRegion(bareDungeon, '.');
        //player is, here, just a Coord that stores his position. In a real game, you would probably have a class for
        //creatures, and possibly a subclass for the player. The singleRandom() method on GreasedRegion finds one Coord
        //in that region that is "on," or -1,-1 if there are no such cells. It takes an RNG object as a parameter, and
        //if you gave a seed to the RNG constructor, then the cell this chooses will be reliable for testing. If you
        //don't seed the RNG, any valid cell should be possible.
        player = floors.singleRandom(rng);
        playerSprite = new AnimatedGlider(new Animation<>(DURATION,
                atlas.findRegions(rng.getRandomElement(possibleCharacters)), Animation.PlayMode.LOOP), player);
//        playerColor = ColorTools.floatGetHSV(rng.nextFloat(), 1f, 1f, 1f);
//        playerSprite.setPackedColor(playerColor);
//        playerSprite.setPosition(player.x * cellWidth, player.y * cellHeight);
        // Uses shadowcasting FOV and reuses the visible array without creating new arrays constantly.
        FOV.reuseFOV(resistance, visible, player.x, player.y, 9.0, Radius.CIRCLE);
        // 0.0 is the upper bound (inclusive), so any Coord in visible that is more well-lit than 0.0 will _not_ be in
        // the blockage Collection, but anything 0.0 or less will be in it. This lets us use blockage to prevent access
        // to cells we can't see from the start of the move.
        blockage = new GreasedRegion(visible, 0.0);
        // Here we mark the initially seen cells as anything that wasn't included in the unseen "blocked" region.
        // We invert the copy's contents to prepare for a later step, which makes blockage contain only the cells that
        // are above 0.0, then copy it to save this step as the seen cells. We will modify seen later independently of
        // the blocked cells, so a copy is correct here. Most methods on GreasedRegion objects will modify the
        // GreasedRegion they are called on, which can greatly help efficiency on long chains of operations.
        seen = blockage.not().copy();
        // Here is one of those methods on a GreasedRegion; fringe8way takes a GreasedRegion (here, the set of cells
        // that are visible to the player), and modifies it to contain only cells that were not in the last step, but
        // were adjacent to a cell that was present in the last step. This can be visualized as taking the area just
        // beyond the border of a region, using 8-way adjacency here because we specified fringe8way instead of fringe.
        // We do this because it means pathfinding will only have to work with a small number of cells (the area just
        // out of sight, and no further) instead of all invisible cells when figuring out if something is currently
        // impossible to enter.
        blockage.fringe8way();
        floors.remove(player);
        int numMonsters = 100;
        monsters = new OrderedMap<>(numMonsters);
        for (int i = 0; i < numMonsters; i++) {
            Coord monPos = floors.singleRandom(rng);
            floors.remove(monPos);
            String enemy = rng.getRandomElement(possibleEnemies);
            AnimatedGlider monster =
                    new AnimatedGlider(new Animation<>(DURATION,
                            atlas.findRegions(enemy), Animation.PlayMode.LOOP), monPos);
//            monster.setPackedColor(ColorTools.floatGetHSV(rng.nextFloat(), 0.75f, 0.8f, 0f));
            // new Color().fromHsv(rng.nextFloat(), 0.75f, 0.8f));
            monsters.put(monPos, monster);
        }
        //This is used to allow clicks or taps to take the player to the desired area.
        toCursor = new ArrayList<>(200);
        //When a path is confirmed by clicking, we draw from this List to find which cell is next to move into.
        awaitedMoves = new ArrayList<>(200);
        //DijkstraMap is the pathfinding swiss-army knife we use here to find a path to the latest cursor position.
        //DijkstraMap.Measurement is an enum that determines the possibility or preference to enter diagonals. Here, the
        //Measurement used is EUCLIDEAN, which allows 8 directions, but will prefer orthogonal moves unless diagonal
        //ones are clearly closer "as the crow flies." Alternatives are MANHATTAN, which means 4-way movement only, no
        //diagonals possible, and CHEBYSHEV, which allows 8 directions of movement at the same cost for all directions.
        playerToCursor = new DijkstraMap(bareDungeon, Measurement.EUCLIDEAN);
        getToPlayer = new DijkstraMap(decoDungeon, Measurement.EUCLIDEAN);
        //These next two lines mark the player as something we want paths to go to or from, and get the distances to the
        // player from all walkable cells in the dungeon.
        playerToCursor.setGoal(player);
        // DijkstraMap.partialScan only finds the distance to get to a cell if that distance is less than some limit,
        // which is 13 here. It also won't try to find distances through an impassable cell, which here is the blockage
        // GreasedRegion that contains the cells just past the edge of the player's FOV area.
        playerToCursor.partialScan(13, blockage);

        bgColor = Color.BLACK;

        lang = '"' + FakeLanguageGen.DEMONIC.sentence(rng, 4, 7,
                new String[]{",", ",", ",", " -"}, new String[]{"...\"", ", heh...\"", ", nyehehe...\"",  "!\"", "!\"", "!\"", "!\" *PTOOEY!*",}, 0.2);

        // this is a big one.
        // SquidInput can be constructed with a KeyHandler (which just processes specific keypresses), a SquidMouse
        // (which is given an InputProcessor implementation and can handle multiple kinds of mouse move), or both.
        // keyHandler is meant to be able to handle complex, modified key input, typically for games that distinguish
        // between, say, 'q' and 'Q' for 'quaff' and 'Quip' or whatever obtuse combination you choose. The
        // implementation here handles hjkl keys (also called vi-keys), numpad, arrow keys, and wasd for 4-way movement.
        // Shifted letter keys produce capitalized chars when passed to KeyHandler.handle(), but we don't care about
        // that so we just use two case statements with the same body, i.e. one for 'A' and one for 'a'.
        // You can also set up a series of future moves by clicking within FOV range, using mouseMoved to determine the
        // path to the mouse position with a DijkstraMap (called playerToCursor), and using touchUp to actually trigger
        // the event when someone clicks.
        input = new InputAdapter() {
            @Override
            public boolean keyUp(int keycode) {
                switch (keycode) {
                case UP:
                case W:
                case NUMPAD_8:
                    toCursor.clear();
                    //+1 is up on the screen
                    awaitedMoves.add(player.translate(0, 1));
                    break;
                case DOWN:
                case S:
                case NUMPAD_2:
                    toCursor.clear();
                    //-1 is down on the screen
                    awaitedMoves.add(player.translate(0, -1));
                    break;
                case LEFT:
                case A:
                case NUMPAD_4:
                    toCursor.clear();
                    awaitedMoves.add(player.translate(-1, 0));
                    break;
                case RIGHT:
                case D:
                case NUMPAD_6:
                    toCursor.clear();
                    awaitedMoves.add(player.translate(1, 0));
                    break;
                case NUMPAD_1:
                    toCursor.clear();
                    awaitedMoves.add(player.translate(-1, -1));
                    break;
                case NUMPAD_3:
                    toCursor.clear();
                    awaitedMoves.add(player.translate(1, -1));
                    break;
                case NUMPAD_7:
                    toCursor.clear();
                    awaitedMoves.add(player.translate(-1, 1));
                    break;
                case NUMPAD_9:
                    toCursor.clear();
                    awaitedMoves.add(player.translate(1, 1));
                    break;
                case PERIOD:
                case NUMPAD_5:
                    toCursor.clear();
                    awaitedMoves.add(player);
                    break;
                case B:
                    batch = (batch == simpleBatch) ? contrastBatch : simpleBatch;
                    break;
                case ESCAPE:
                    Gdx.app.exit();
                    break;
                }
                return true;
            }

            // if the user clicks and mouseMoved hasn't already assigned a path to toCursor, then we call mouseMoved
            // ourselves and copy toCursor over to awaitedMoves.
            @Override
            public boolean touchUp(int screenX, int screenY, int pointer, int button) {
                pos.set(screenX, screenY, 0f);
                mainViewport.unproject(pos);
                if (onGrid(MathUtils.floor(pos.x) >> 4, MathUtils.floor(pos.y) >> 4)) {
                    mouseMoved(screenX, screenY);
                    awaitedMoves.addAll(toCursor);
                    return true;
                }
                return false;
            }

            @Override
            public boolean touchDragged(int screenX, int screenY, int pointer) {
                return mouseMoved(screenX, screenY);
            }

            // causes the path to the mouse position to become highlighted (toCursor contains a list of Coords that
            // receive highlighting). Uses DijkstraMap.findPathPreScanned() to find the path, which is rather fast.
            @Override
            public boolean mouseMoved(int screenX, int screenY) {
                if(!awaitedMoves.isEmpty())
                    return false;
                pos.set(screenX, screenY, 0f);
                mainViewport.unproject(pos);
                if (onGrid(screenX = MathUtils.floor(pos.x) >> 4, screenY = MathUtils.floor(pos.y) >> 4)) {
                    // we also need to check if screenX or screenY is the same cell.
                    if (cursor.x == screenX && cursor.y == screenY) {
                        return false;
                    }
                    cursor = Coord.get(screenX, screenY);
                    // This uses DijkstraMap.findPathPreScannned() to get a path as a List of Coord from the current
                    // player position to the position the user clicked on. The "PreScanned" part is an optimization
                    // that's special to DijkstraMap; because the part of the map that is viable to move into has
                    // already been fully analyzed by the DijkstraMap.partialScan() method at the start of the
                    // program, and re-calculated whenever the player moves, we only need to do a fraction of the
                    // work to find the best path with that info.
                    toCursor = playerToCursor.findPathPreScanned(cursor);
                    // findPathPreScanned includes the current cell (goal) by default, which is helpful when
                    // you're finding a path to a monster or loot, and want to bump into it, but here can be
                    // confusing because you would "move into yourself" as your first move without this.
                    // Getting a sublist avoids potential performance issues with removing from the start of an
                    // ArrayList, since it keeps the original list around and only gets a "view" of it.
                    if (!toCursor.isEmpty()) {
                        toCursor = toCursor.subList(1, toCursor.size());
                    }
                }
                return false;
            }
        };
        Gdx.input.setInputProcessor(input);
    }

    /**
     * Move the player if he isn't bumping into a wall or trying to go off the map somehow.
     * In a fully-fledged game, this would not be organized like this, but this is a one-file demo.
     * @param newX
     * @param newY
     */
    private void move(int newX, int newY) {
        if (health <= 0) return;
        if (newX >= 0 && newY >= 0 && newX < bigWidth && newY < bigHeight
                && bareDungeon[newX][newY] != '#') {
            // '+' is a door.
            if (lineDungeon[newX][newY] == '+') {
                decoDungeon[newX][newY] = '/';
                lineDungeon[newX][newY] = '/';
                // changes to the map mean the resistances for FOV need to be regenerated.
                resistance = DungeonUtility.generateSimpleResistances(decoDungeon);
                // recalculate FOV, store it in fovmap for the render to use.
                FOV.reuseFOV(resistance, visible, player.x, player.y, fovRange, Radius.CIRCLE);
                blockage.refill(visible, 0.0);
                seen.or(blockage.not());
                blockage.fringe8way();
            } else {
                // recalculate FOV, store it in fovmap for the render to use.
                FOV.reuseFOV(resistance, visible, newX, newY, fovRange, Radius.CIRCLE);
                blockage.refill(visible, 0.0);
                seen.or(blockage.not());
                blockage.fringe8way();
                playerSprite.start = player;
                playerSprite.end = (player = Coord.get(newX, newY));
                playerSprite.change = 0f;
                phase = Phase.PLAYER_ANIM;
                animationStart = TimeUtils.millis();
                // if a monster was at the position we moved into, and so was successfully removed...
                if(monsters.containsKey(player))
                {
                    monsters.remove(player);
                    for (int x = -1; x <= 1; x++) {
                        for (int y = -1; y <= 1; y++) {
                            if(rng.nextBoolean())
                                bgColors[newX+x][newY+y] = FLOAT_BLOOD;
                        }
                    }
                }
            }
            phase = Phase.PLAYER_ANIM;
        }
    }

    private void postMove()
    {
        phase = Phase.MONSTER_ANIM;
        Coord[] playerArray = {player};
        // in some cases you can use keySet() to get a Set of keys, but that makes a read-only view, and we want
        // a copy of the key set that we can edit (so monsters don't move into each others' spaces)
//        OrderedSet<Coord> monplaces = monsters.keysAsOrderedSet();
        int monCount = monsters.size();

        // recalculate FOV, store it in fovmap for the render to use.
        FOV.reuseFOV(resistance, visible, player.x, player.y, fovRange, Radius.CIRCLE);
        blockage.refill(visible, 0.0);
        seen.or(blockage.not());
        blockage.fringe8way();
        // handle monster turns
        ArrayList<Coord> nextMovePositions;
        for(int ci = 0; ci < monCount; ci++)
        {
            Coord pos = monsters.firstKey();
            AnimatedGlider mon = monsters.removeFirst();
            // monster values are used to store their aggression, 1 for actively stalking the player, 0 for not.
            if (visible[pos.x][pos.y] > 0.1) {
                getToPlayer.clearGoals();
                nextMovePositions = getToPlayer.findPath(1, 7, monsters.keySet(), null, pos, playerArray);
                if (nextMovePositions != null && !nextMovePositions.isEmpty()) {
                    Coord tmp = nextMovePositions.get(0);
                    // if we would move into the player, instead damage the player and give newMons the current
                    // position of this monster.
                    if (tmp.x == player.x && tmp.y == player.y) {
                        // not sure if this stays red for very long
                        playerSprite.color = (FLOAT_BLOOD);
                        health--;
                        // make sure the monster is still actively stalking/chasing the player
                        monsters.put(pos, mon);
                    }
                    // otherwise store the new position in newMons.
                    else {
                        // alter is a method on OrderedMap and OrderedSet that changes a key in-place
                        monsters.alter(pos, tmp);
                        mon.start = pos;
                        mon.end = tmp;
                        mon.change = 0f;
                        //display.slide(mon, pos.x, pos.y, tmp.x, tmp.y, 0.125f, null);
                        monsters.put(tmp, mon);
                    }
                } else {
                    monsters.put(pos, mon);
                }
            }
            else
            {
                monsters.put(pos, mon);
            }
        }

    }

    /**
     * Draws the map, applies any highlighting for the path to the cursor, and then draws the player.
     */
    public void putMap()
    {
        final float time = TimeUtils.timeSinceMillis(startTime) * 0.001f;
        //In many other situations, you would clear the drawn characters to prevent things that had been drawn in the
        //past from affecting the current frame. This isn't a problem here, but would probably be an issue if we had
        //monsters running in and out of our vision. If artifacts from previous frames show up, uncomment the next line.
        //display.clear();
        for (int i = 0; i < bigWidth; i++) {
            for (int j = 0; j < bigHeight; j++) {
                if(visible[i][j] > 0.0) {
                    pos.set(i * cellWidth, j * cellHeight, 0f);
                    batch.setPackedColor(toCursor.contains(Coord.get(i, j))
                            ? ColorTools.lerpFloatColors(bgColors[i][j], FLOAT_WHITE, 0.9f)
                            : ColorTools.lerpFloatColors(bgColors[i][j], FLOAT_LIGHTING, (float)visible[i][j] * 0.75f + 0.25f));
                    if(lineDungeon[i][j] == '/' || lineDungeon[i][j] == '+') // doors expect a floor drawn beneath them
                        batch.draw(charMapping.get('.', solid), pos.x, pos.y, cellWidth, cellHeight);
                    batch.draw(charMapping.get(lineDungeon[i][j], solid), pos.x, pos.y, cellWidth, cellHeight);
                } else if(seen.contains(i, j)) {
                    pos.set(i * cellWidth, j * cellHeight, 0f);
                    batch.setPackedColor(ColorTools.lerpFloatColors(bgColors[i][j], FLOAT_GRAY, 0.7f));
                    if(lineDungeon[i][j] == '/' || lineDungeon[i][j] == '+') // doors expect a floor drawn beneath them
                        batch.draw(charMapping.get('.', solid), pos.x, pos.y, cellWidth, cellHeight);
                    batch.draw(charMapping.get(lineDungeon[i][j], solid), pos.x, pos.y, cellWidth, cellHeight);
                }
            }
        }
        batch.setPackedColor(FLOAT_WHITE);
        AnimatedGlider monster;
        for (int i = 0; i < bigWidth; i++) {
            for (int j = 0; j < bigHeight; j++) {
                if (visible[i][j] > 0.0) {
                    if ((monster = monsters.get(Coord.get(i, j))) != null) {
                        batch.draw(monster.animate(time), monster.getX() * cellWidth, monster.getY() * cellHeight);
                    }
                }
            }
        }
        batch.draw(playerSprite.animate(time), playerSprite.getX() * cellWidth, playerSprite.getY() * cellHeight);
        Gdx.graphics.setTitle(Gdx.graphics.getFramesPerSecond() + " FPS");
    }
    @Override
    public void render () {
        // standard clear the background routine for libGDX
        Gdx.gl.glClearColor(bgColor.r, bgColor.g, bgColor.b, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // center the camera on the player's position
        camera.position.x = playerSprite.getX() * cellWidth;
        camera.position.y =  playerSprite.getY() * cellHeight;
        camera.update();

        mainViewport.apply(false);
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        shader.setUniformf("TextureSize", gridWidth * cellWidth, gridHeight * cellHeight);
        shader.setUniformf("OutputSize", Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        // you done bad. you done real bad.
        if (health <= 0) {
            // still need to display the map, then write over it with a message.
            putMap();
            float wide = mainViewport.getWorldWidth(),
                    x = playerSprite.getX() * cellWidth - mainViewport.getWorldWidth() * 0.5f,
                    y = playerSprite.getY() * cellHeight;

            font.draw(batch, "[RED]YOUR CRAWL IS OVER![WHITE]", x, y + 32, wide, Align.center, true);
            font.draw(batch, "A monster sniffs your corpse and says,", x, y + 16, wide, Align.center, true);
            font.draw(batch, lang, x, y, wide, Align.center, true);
            font.draw(batch, "[LIGHT_GRAY]q[WHITE] to quit.", x, y - 32, wide, Align.center, true);
            batch.end();
            if(Gdx.input.isKeyPressed(Q))
                Gdx.app.exit();
            return;
        }

        // need to display the map every frame, since we clear the screen to avoid artifacts.
        putMap();

        if(phase == Phase.MONSTER_ANIM) {
            float t = TimeUtils.timeSinceMillis(animationStart) * 0.008f;
            for (int i = 1; i < monsters.size(); i++) {
                monsters.getAt(i).change = t;
            }
            if (t >= 1f) {
                phase = Phase.WAIT;
                if (!awaitedMoves.isEmpty()) {
                    Coord m = awaitedMoves.remove(0);
                    if (!toCursor.isEmpty())
                        toCursor.remove(0);
                    move(m.x, m.y);
                }
            }
        }
        else if(phase == Phase.WAIT && !awaitedMoves.isEmpty())
        {
            Coord m = awaitedMoves.remove(0);
            if (!toCursor.isEmpty())
                toCursor.remove(0);
            move(m.x, m.y);
        }
        else if(phase == Phase.PLAYER_ANIM) {
            playerSprite.change = TimeUtils.timeSinceMillis(animationStart) * 0.008f;
            if (playerSprite.change >= 1f) {
                phase = Phase.MONSTER_ANIM;
                animationStart = TimeUtils.millis();
                postMove();
                // this only happens if we just removed the last Coord from awaitedMoves, and it's only then that we need to
                // re-calculate the distances from all cells to the player. We don't need to calculate this information on
                // each part of a many-cell move (just the end), nor do we need to calculate it whenever the mouse moves.
                if (awaitedMoves.isEmpty()) {
                    // the next two lines remove any lingering data needed for earlier paths
                    playerToCursor.clearGoals();
                    playerToCursor.resetMap();
                    // the next line marks the player as a "goal" cell, which seems counter-intuitive, but it works because all
                    // cells will try to find the distance between themselves and the nearest goal, and once this is found, the
                    // distances don't change as long as the goals don't change. Since the mouse will move and new paths will be
                    // found, but the player doesn't move until a cell is clicked, the "goal" is the non-changing cell, so the
                    // player's position, and the "target" of a pathfinding method like DijkstraMap.findPathPreScanned() is the
                    // currently-moused-over cell, which we only need to set where the mouse is being handled.
                    playerToCursor.setGoal(player);
                    // DijkstraMap.partialScan only finds the distance to get to a cell if that distance is less than some limit,
                    // which is 13 here. It also won't try to find distances through an impassable cell, which here is the blockage
                    // GreasedRegion that contains the cells just past the edge of the player's FOV area.
                    playerToCursor.partialScan(13, blockage);
                }
            }
        }
        // if the previous blocks didn't happen, and there are no active animations, then either change the phase
        // (because with no animations running the last phase must have ended), or start a new animation soon.
        else {
            switch (phase) {
                case WAIT:
                    break;
                case MONSTER_ANIM: {
                    phase = Phase.WAIT;
                }
                break;
                case PLAYER_ANIM: {
                    postMove();
                }
            }
        }
        pos.set(10, Gdx.graphics.getHeight() - cellHeight - cellHeight, 0);
        mainViewport.unproject(pos);
        font.draw(batch, "Current Health: [RED]" + health + "[WHITE]", pos.x, pos.y);
        batch.end();
    }
    @Override
	public void resize(int width, int height) {
		super.resize(width, height);
        mainViewport.update(width, height, false);
	}
}
// An explanation of hexadecimal float/double literals was mentioned earlier, so here it is.
// The literal 0x1p-9f is a good example; it is essentially the same as writing 0.001953125f,
// (float)Math.pow(2.0, -9.0), or (1f / 512f), but is possibly faster than the last two if the
// compiler can't optimize float division effectively, and is a good tool to have because these
// hexadecimal float or double literals always represent numbers accurately. To contrast,
// 0.3 - 0.2 is not equal to 0.1 with doubles, because tenths are inaccurate with floats and
// doubles, and hex literals won't have the option to write an inaccurate float or double.
// There's some slightly confusing syntax used to write these literals; the 0x means the first
// part uses hex digits (0123456789ABCDEF), but the p is not a hex digit and is used to start
// the "p is for power" exponent section. In the example, I used -9 for the power; this is a
// base 10 number, and is used to mean a power of 2 that the hex digits will be multiplied by.
// Because the -9 is a base 10 number, the f at the end is not a hex digit, and actually just
// means the literal is a float, in the same way 1.5f is a float. 2.0 to the -9 is the same as
// 1.0 / Math.pow(2.0, 9.0), but re-calculating Math.pow() is considerably slower if you run it
// for every cell during every frame. Though this is most useful for negative exponents because
// there are a lot of numbers after the decimal point to write out with 0.001953125 or the like,
// it is also sometimes handy when you have an integer or long written in hexadecimal and want
// to make it a float or double. You could use the hex long 0x9E3779B9L, for instance, but to
// write that as a double you would use 0x9E3779B9p0 , not the invalid syntax 0x9E3779B9.0 .
// We use p0 there because 2 to the 0 is 1, so multiplying by 1 gets us the same hex number.
// Very large numbers can also benefit by using a large positive exponent; using p10 and p+10
// as the last part of a hex literal are equivalent. You can see the hex literal for any given
// float with Float.toHexString(float), or for a double with Double.toHexString(double) .
// SColor provides the packed float versions of all color constants as hex literals in the
// documentation for each SColor.
// More information here: https://blogs.oracle.com/darcy/hexadecimal-floating-point-literals

redpajama_set_name: RedPajamaGithub


I'm thinking of dumping ATT Uverse / Yahoo. It seems overpriced and not as fast compared to Xfinity. I was wondering if anybody here had Xfinity and what you thought about it.
Yeah I have it. Fastest internet I've ever been able to pay for. I've heard nothing but negative feedback for U Verse. Have had a more enjoyable time on Xfinity in contrast to all my friends on U Verse.
Thanks. I've had ATT in some way shape or form forever, and I'm just really sick of it and calling their tech support service.
Cable modem is going to be faster than DSL. Personally I'm on Att (as it's more than enough -v- Time Warner) but Cable will be your fastest bet for the price. I don't know if dealing with Comcast will be worth it, but the modem is fast.
You might want to look into buying your own cable modem -v- renting theirs, though.
Thanks for the replies. I'm going to give this a hard think.


Heat Cap: The Personal Heat Caps is your best bet whenever you need heat to activate your products or enhance the results of a hair treatment. Whenever you need heat for a home treatment, a Deep Conditioning Treatments or to prepare you hair for an in-salon service, the Personal Heat Cap is your answer.
The Lanza Ultimate Treatment, and the Malibu Makeover Treatments, both require heat and this is your easy, quiet answer. When you want to spoil your hair the heat even helps with Biogenol Ultra Deep Masque our most popular and most often requested hair treatment.
Great for home use instead of noisy bonnet type dryers and bulky, stand alone salon dryers. Great when you want to help your hair and save your money and do your own hair treatments at home! See Deep Conditioning Hair Treatment for more deep conditioning choices.


text:
Examining filmmaking
Alexandra Riva, [email protected]|December 3, 2015
Cathie Lawrence
LMC Special Guest Lecture and Workshops, Yemi Bamiro.Little Theatre, Pittsburg, Ca. November 30, 2015.
Yemi Bamiro, a producer and director for VICE Media, visited Los Medanos College Monday, Nov. 30 to give students a look into documentary filmmaking.
"I actually started off as a journalist," said Bamiro at the start of his lecture titled "Me, Africa, and Working for TV."
Bamiro first began working for The VOICE, dubbed Britain's Favorite Black Newspaper, but soon discovered that it would be difficult to make a living there as he was paid by the word for every article he wrote, and London is very expensive.
"I worked for The VOICE for about two years and it was always in entertainment, so it was always interviewing music artists and speaking to actors and stuff like that," he said.
When Bamiro left The VOICE, he began an internship at MTV, "when it was still sort of cool," he explained.
"When I graduated, I realized I sort of wanted to go back into media. I got an internship at MTV, which is probably the best job that any 20-year-old could have working in TV. It was when TV was really cool, like MTV was really cool. It was before YouTube. It was before all music TV had gone online," he said about his nearly six-year stint at MTV.
When Bamiro left MTV, he briefly worked for VICE News prior to getting a job at Sky Media. Sky is a major broadcast company in Europe. It was during his nearly three-year employment at Sky in which his work was focused predominantly around sports.
"I worked on Sky Sports, which is their formula one channel. It was a really good job because I was always interested in formula one," said Bamiro. "You guys have NASCAR here, but as a kid I used to watch formula one."
After his time at Sky, he returned to VICE and has been working there ever since.
"I had always been interested in what VICE did. It's always challenging. It's always engaging. It's always, you know, it goes against the grain," he said.
VICE, founded by Shane Smith, is known for being an irreverent and brutally honest news source, geared toward a younger audience. VICE has taken Bamiro all around the world, but he spoke specifically of his travels to the continent of Africa.
"Last week we were doing some stuff in Japan for VICE Sports. The week before that we were in Chicago," said Bamiro, whose position at VICE allows him explore subjects he loves, such as sports, as well as many others.
Bamiro shared a number of tips with the audience to help them learn to develop a story idea, starting with "Story is King."
"Everything starts with an amazing story," said Bamiro to an attentive crowd. "There are always stories that are nestled away, so yeah, story is king."
One unusual story Bamiro discovered while working for VICE brought him to a maximum-security prison in Uganda.
"I found this article about a prison in Uganda that has a fully realized soccer league. So, it's a maximum-security prison in Uganda but it also has a soccer league. There are twelve teams in this league. All the teams are named after European football teams," said Bamiro.
A story as different as this one is bound to have a cast of enticing characters, bringing up Bamiro's next point to "find strong characters."
"They also have player salaries, so the inmates are actually paid, but they're not paid cash, they're paid by prison commodities, like soap and sugar," he explained. "The players are also traded from one team to another as well, so it's completely realized, completely functional."
The documentary he and his crew filmed in the Ugandan prison is not yet completed, but it will eventually air on VICE Land, VICE's television network.
Finally, Bamiro's last pieces of advice were to 'be patient' when filming and developing a story and to 'watch as many different documentaries as possible.'
"If you really believe in your idea and you really believe in your story, then you will make it happen," said Bamiro.
Alexandra Riva, Staff
Cathie Lawrence, Sports Photographer/ Staff Writer
I'm very excited to be working on the staff of the Experience. I continue to enjoy my position as a Sports Photographer and Staff Writer...

redpajama_set_name: RedPajamaCommonCrawl


With great anticipation and excitement, we all met in Atlanta for our Christian Israel Tour and international Delta direct flight to Tel Aviv. The group arrived from all areas of the country, representing at least a dozen states or so. New friendships are being made as we embark on this life-changing trip together.
We landed safely after a comfortable flight in Tel Aviv. After getting through passport control, we secured our bags and exited the airport. Shlomo, our Israeli guide, met the group. En route to our hotel in Netanya, we made a quick stop to Jaffa, where we recalled the stories of Jonah and Peter (Acts 9). Following our dinner here at the King Solomon hotel, a few of us enjoyed a walk. We bought "Haman ear" cookies in celebration of the tail end of Purim. Praise God for His guidance so far. He has brought together a great group of believers from all over the country.
The day started with an optional walk down to the Mediterranean beach. About 15 of us enjoyed the sunrise here. After breakfast our first stop was Caesarea. We all were impressed by this city built by Herod the Great. We sat in the theater, listening to the stories from Acts (chapters 10, 12, 26) that took place here. We walked by the hippodrome as well as by the harbor area before boarding the bus for one final view of the ancient aqueduct.
Our next stop was Mt. Carmel, where I Kings 18 was read about the story of Elijah vs. the prophets of Baal. We enjoyed a falafel lunch nearby. We journeyed to Megiddo next, this impressive archaeological city of 22 levels of ruins. Rev. 16 was read about "Armageddon" and the final battle that will take place here. We walked down 180 steps through the city's ancient water system as well.
Driving across the Jezreel Valley, Nazareth was the next stop. We enjoyed visiting the Church of the Well, where Luke 1 was read about the Mary and her encounter with Gabriel. Our final stop of the day was Mt. Arbel. Shlomo our guide was able to convince the Parks staff to allow us in, even after closing hours. Walking to the top, a spectacular view of the Sea of Galilee can be seen from here. We arrived at Maagan, our "kibbutz/hotel" for the next 2 nights. It's a very quiet place located on the southern shores of the Sea of Galilee. Following dinner, we enjoyed reflecting upon the day's experiences while sitting on the beach together. God blessed us with great weather today too, with full sun and 65 degree temps!
We began our day with going to the Mount of Beatitudes. Shlomo, our guide, shared Matthew 5 in Hebrew, with Pastor John reading the English. We also enjoyed Shomo's 'recorder' music he shared. It was a peaceful and meditative time for all. Close by, we visited was Capernaum. Here, we sat in the 4/5th century snyogogue where Mark 1,2 and 9 were shared. "Tabgha" was our next stop, remembering Jesus' feeding of the 5,000+.
A highlight of the morning was our boat ride from Nof Ginnosar. We all enjoyed making our journey to the middle of the lake, as well as a worship/quiet time. The "storm" narratives from Mark 4 & 6 were shared. We also saw the 1st century boat, discovered in 1986 along these shores of this NW corner of the Sea of Galilee.
After lunch at Nof, we traveled north to Caesarea Philippi and the Golan Heights. Matthew 16 was read as the question was asked, "Who do you say I am?" We continued up through the Golan Heights, coming 100 yards from the Lebanon border and 2 miles from Syria. The vantage point from "Bental," an old Israeli military outpost gave us a great view of Mt. Hermon and Syria. We understood how critical it is for Israel to remain in control of this strategic region.
We arrived back at our hotel at Maagan by traveling around the eastern side of the Sea of Galilee. We enjoyed "Shabat dinner" together as well as the optional group gathering to help us interact with all that we exprienced on this 2nd full day of our tour.
Leaving Maagan, our first stop of the day was to the Kinneret Cemetery located on the southern shores of Galilee. Here, Shlomo shared about the life of a Jewish immigran from the late 1,900s named Rachel, reading a poem from her works. From here we continued to Yardenent. A total of 22 re-affirmed their faith in Christ in baptism. A wonderful spiritual moment for the group!
To end the day, we ascended more than 4,000 feet to Jerusalem. Seeing the city from the Mt. of Olives was a great experience. We walked down the "Palm Sunday" route, reading from Matthew 21 and Zechariah 14, a prophetic word that speaks about Jesus being crowned king at his 2nd coming. We entered the Dominus Flavet (where Jesus wept over Jerusalem) and Church of all Nations churches (Gethsemane, where Jesus was betrayed by Judas).
Upon arriving at the beautiful Grand Court Hotel just north of the Old City of Jerusalem, we enjoyed dinner together, and then the optional walk to the Damascus Gate.
The day started early by entering the Old City at the Dung Gate with a walk through the now famous "Western Wall Tunnels," an archaeological walk along the retaining wall of the Western Wall of the Temple Mount. Upon exiting the walk at the end, we stopped by The pools of Bethesda (at St. Anne's Church). The group sang beautifully in the "echoing" sanctuary. We then continued along the Via Delarosa street, stopping at the "Lithostrotos" pavement at which Pilate sentenced Jesus to death (Antonia Fortress). In the rainy weather, we walked the stations of the cross until we arrived at the Church of the Holy Sepulcher, the one possible site for the crucifixion and tomb of Christ.
Leaving the Old City for the afternoon, we traveled into Bethlehem. Here, we shopped at an olive wood store as well as entered the Church of the Nativity where was read from Luke 2 and sang carols at the traditional place where Christ was born. Our Christmas celebration will never be the same!
We ended the day of touring by going to Yad Vashem, the Israeli Holocaust Museum. It was a moving time to hear Shlomo, our guide, share about the many of his family who lost their lives in Poland. We returned to the the hotel for another great dinner as well as a optional walk to Ben Yehuda Street following all the yummy desserts we ate.
We headed east back through the Wilderness of Judah today to the Dead Sea area. Leaving the cool and sunny skies of Jerusalem, we descended over 4,000+ feet in elevation, arriving at Engedi (I Samuel 22) and the warm sun of the dessert. Here, we hiked into the water falls area, where the story of David and Saul was read, along with the story of Jehosaphat (II Chr. 20). We also saw coneys and ibex, a long-horned goat-like animal that lives in this area.
Our next stop was Masada, the Jewish fortress that valiantly battled the Romans from 70-73 A.D. This 1,000 foot high fortress overlooking the Dead Sea is quite impressive, a palace built by Herod the Great. We saw cisterns, the Roman siege ramp, Herod's northern 3-tiered palace, storehouses, and bathhouses. 7 walked down the snake path.
Our last stop was Qumran, where the Essenes lived as they penned the Dead Sea Scrolls. Following lunch, we saw Jewish mikvas (ritual baths), scriptoriums, among other excavations from this scribal community. Thanks be to God for the preservation of His Word.
Before returning west to Jerusalem, we enjoyed floating in the Dead Sea, a body of water with 33% salt/mineral content. Most everyone enjoyed this unique floating experience.
As a surprise, "Zvi," the voice of "Israel, My Glory" ministry, joined us for dinner and a optional meeting after dinner. An opitonal walk to the Western Wall concluded the evening. What another great day!
Waking to another sunny morning here in Jerusalem, our first stop after breakfast was the Temple Mount. This was the location of both the 1st and 2nd temples. Today, it is the location of the Dome of the Rock. Leaving the Temple Mount, we visited the Western Wall, the most holy place in Judaism. Most went down to the Wall to offer prayers. Preceding to the southern excavations of the Temple, we all were amazed at the size of the massive stones that toppled to the Roman street in 70 A.D. Here, we also saw the corner (pinnacle) of the Temple as well as the Temple steps that are still preserved today. No doubt, both the Roman street on which we walked as well as the steps on which we sat were the same Jesus used. On the steps, Mark 12 and Acts 2 were mentioned.
Before lunch, we visited the City of David excavations. Here, we heard the stories of David conquering the Jebusites (II Sam. 5), and Hezekiah making the water tunnel during the Assyrian siege of the city. many of us walked through "Hezekiah's Tunnel" (1720 feet long) in water about knee deep. The tunnel exits at the Siloam Pool (John 9), where Jesus sent the blind man.
We ate lunch in the Jewish Quarter. Following this, we went to Shoreshim, the store of Moshe, an orthodox Jew. Moshe shared about his Jewish faith and the similarities and differences between Judaism and Christianity. After this, we visited some of the Jewish Quarter before leaving via the Zion's gate.
Our last stop of the day was to the Garden Tomb of Christ, north of the Old City. We saw "skull hill" as well as the proposed tomb of Christ. We enjoyed a communion service together here, singing about Christ's death and resurrection. It was a great way to end the day.
Before arriving at the hotel, we said goodbye to Shlomo our guide. After dinner, we had one last meeting as a large group. An optional walk to back to the Ben Yehuda plaza was enjoyed by 13 of us.
This day was a "free" day for those going home tonight. It was spent in the Old City for most, exploring and shopping! For others (15 of us), after enjoying a few hours within the Old City, we departed the Grand Court hotel and headed south towards Elat. Our lunch stop was at Ein Bokek along the Dead Sea. Our next stop was Timna, a national park now. Here, copper mines dating from the 14th – 12th centuries, B.C. A full-size replica of the Tabernacle can also be seen here. In addtion, we explored Solomon's Pillars, climbing within the rock formations.
We journeyed a little farther south until we arrived at the Reef hotel right on the Red Sea in Elat. What a beautiful area, with a great view across to Aqaba, Jordan. We enjoyed dinner together as well as some fellowship time together.
What another great day! Here in Elat, we were greeted by a terrific sunrise over the Jordanian mountains to the east. After an early breakfast, we left our hotel along the Red Sea for a day at Petra in Jordan. Crossing at the Rabin border, we met our Jordanian guide and driver on the other side. From here, we drove 2 hours to Petra, this magnificent Nabatean city of red rock! We walked into the site together. The "Siq" (canyon) was spectacular, with high walls of rock on each side. After a mile, the whole city of Petra opens up at the "Treasury Building." The end of the Siq and this famous tomb of the Nabatean King Aretas was highlighted in he last Indiana Jones movie. The Treasury Building stands 120 feet high and 90 feet wide. Because of being protected from the weather these last 2,000 years, it still looks quite impressive.
From here, we walked past various other tombs and monuments, a Roman theater, and Urn Tomb, and an impressive Roman street. Here, Pastor John met up with a Bedouin family from previous trips. They also warmly welcomed the group. We ate lunch a little further down in the Nabatean Tent.
After lunch, the group had free time until 4 p.m. While some enjoyed a leisurely walk back through the city, 7 adventured to the High Place. "Sela," the oldest son on the Bedouin family, accompanied us to the top. He also took his donkey named "Flower." What a spectacular hike as it winded up through the rock formations and tombs to the top. Sela provided wonderful entertainment too for us all. The view from the top was breath-taking. We descended together down the front side. We then walked back out the Siq to the entrance. Most enjoyed ice cream and a coke after the long walk.
We arrived back at the border. Once we crossed, we went back to the Reef Hotel for a 2nd night here. Dinner was enjoyed, as well as an early bedtime for most.
Our last full day began with a leisurely start. A few of us went swimming in the Dead Sea, enjoying the coral and colorful fish, while others walked the beach or slept in a bit. At 9:15, we rolled out from our hotel in Elat, and headed for an interesting ride up and through the Machtesh Ramon (Israel's Grand Canyon). Here, we saw a brief video clip and enjoy the view from the observation station.
After some ice cream and a coke, we continued heading north to Beersheba located in the Biblical Negev. Here, we saw the well, the rounded streets, 4-room Israelite houses, and a replica of a 4-horned altar. The continuing journey on this last day was to proceed northward to Tel Azekah. It is the site of an ancient un-excavated city located in the Elah Valley. I Samuel 17 was read, the story of David an Goliath from nearby Gath. The "Shephelah" of Lowlands of Judah served as a "buffer zone" for most of the time of early Israelite history. Our last stop was BethShemesh, where I Samuel 6 was read concerning the return of the Ark of the Covenant.
We ate dinner back in Jerusalem at the Ambassador hotel before making our final journey to the Ben Gurion Airport in Tel Aviv.
We arrived safely this morning in Atlanta. We said goodbye once we landed and went through customs. What a great trip for all!


Puerto madryn, Argentina (November 4, 2016)—The Wildlife Friendly Enterprise Network (WFEN) and the Wildlife Conservation Society-Argentina (WCS) are pleased to announce traceable Certified Wildlife Friendly® wool—part of the "Patagonian Fibers with a Conscience" program—from the "Merino de Peninsula Valdés™" ranchers who raise wool in coexistence with wildlife on Peninsula Valdés. The traceable certified wool is now available for purchase through a new online portal.
WCS Argentina supports the ranchers of the Merino Peninsula Valdés™ group who are committed to managing their ranches to allow healthy populations of guanacos, rheas, and maras to co-exist with their sheep, and to use non-lethal methods to control predation by pumas, chilla foxes, and Geoffroy's and pampas cats. Fundación Vida Silvestre Argentina (FVSA) will provide third-party verification of compliance with commitments and collaborate with WCS to monitor impacts on wildlife. "We all agree in making the coexistence between sheep ranching and healthy wildlife a long-term achievement," said Alejandro Arias, coordinator of the FVSA program in Península Valdés.
Península Valdés is a 4,000–square-kilometer (1,544 square miles) protected area in Patagonia, declared a UNESCO Natural World Heritage Site in 1999. Compared to other sites in the region, the steppe of Península Valdés still harbors significant populations of native wildlife, and its waters are critical habitat for southern right whales, sea lions, and elephant seals during reproduction. Although a management plan has been effective in conserving coastal wildlife, the land is privately owned and sheep ranching is widespread within the area.
"These ranchers are committed to implement wildlife-friendly practices because they are convinced that their economic futures are better served by moving away from maximizing sheep stocking rates on their ranches and adding value by conserving native species at Península Valdés, an emblematic site of Patagonia. To achieve our goals, we are implementing management actions based on scientific research on wildlife ecology," said Ricardo Baldi, a scientist from CONICET, the Argentine national science agency, and consultant for WCS.
"'Patagonian Fibers with a Conscience™' serves as an inspiring example of how to combine sustainability with effective conservation," said Dr. Guillermo Harris, Director of WCS's Argentina Program. "We're showing that we can protect guanacos and other wildlife and support the local economy. It's a win-win for Peninsula Valdés." WCS work with these ranchers is supported by the USFWS Wildlife without Borders program.
"Projects like Wildlife Friendly® and Merino de Peninsula Valdés™ give new designers like me the unique opportunity to do what is right from the beginning," said Sarah Chojecki, founder of Bolek. Ms. Chojecki, a graduate of the Fashion Institute of Technology, is headquartered in New York City and curated a partnership with Wildlife Friendly® on the basis that consumers should have ecological awareness and sustainability in the forefront of their minds when purchasing.
"We applaud forward thinking designers like Ms. Chojecki for building wildlife and sustainability into the DNA of their companies," said Ms. Stein.
MISSION: WCS saves wildlife and wild places worldwide through science, conservation action, education, and inspiring people to value nature. VISION: WCS envisions a world where wildlife thrives in healthy lands and seas, valued by societies that embrace and benefit from the diversity and integrity of life on earth. To achieve our mission, WCS, based at the Bronx Zoo, harnesses the power of its Global Conservation Program in more than 60 nations and in all the world's oceans and its five wildlife parks in New York City, visited by 4 million people annually. WCS combines its expertise in the field, zoos, and aquarium to achieve its conservation mission.


Information for "AG150 - Breeding House Practitioner and the Pokémon Egg!"
Display title AG150 - Breeding House Practitioner and the Pokémon Egg!
Default sort key AG150 - Breeding House Practitioner and the Pokémon Egg!


Thanks to The Fantasy Book Critic blog for their extensive review of Blood Song.
They've also done an interview with yours truly which should appear on Monday 6th August.
This entry was posted on Thursday, July 26th, 2012 at 7:20 am	and posted in Writing Stuff.	You can follow any responses to this entry through the RSS 2.0 feed.
The link doesn't seem to be working, it takes us to the blog page but not the review. Am I missing soemthing here?
Hi Alec, You can scroll down for the review. However I've also updated the link to the specific review page.
Gah, I was trying to read it from my tablet and it wouldn't scroll down entirely for me. I feel like a moron now.
Just wanted to say thanks for a great read and congrats on the publishing deal. Just wondering if your deal is just for US publishing rights? I reviewed it over on my site if your interested in what I had to say about it. http://www.sffmania.com Here's hoping with FBC having reviewed it some of the other big fantasy blogs follow suit.
Now if only a first edition eBook would be worth something when you become the next big thing. Wanna sign my kindle;) ???
Thanks Chris. The contract with ACE / ROC covers world rights as well as the US.
Lastly,a quick question,will the 2nd book in the series be published in 2013 or is it more likely to be out in 2014?
Thanks John. Book 2's release date rests with my publisher, but were I a betting man I'd go for 2014.


The 38th Annual Blytheville Chili Cook-Off happens October 19 and 20, 2018 in Historic Downtown Blytheville.
The 38th Annual Blytheville Chili Cook-Off kicks off Friday night, October 19, 2018, with our Party In Pocket Park from 4 p.m. to 10 p.m.. Come downtown for live music, food trucks, cold beer and fun for everyone.
Then Saturday, Main Street will be filled with arts and crafts, jewelry and food vendors. Plus, sample and vote on the best chili in the Mid-South. The beer garden will also be open.
If you group would like to be part of this annual tradition, download our Vendor Form and Complete Contest Rules. Be sure to fill them out and mail back with your vendor fee.
While you're here, be sure to take a look at our OFFICIAL CHILI COOK-OFF RULES & REGULATIONS.
For media inquiries, or more information, please contact L.C. Hartsfield at 870.763.2525 or via email.


Automatically discover insights from your contracts to accelerate time-to-value.
ABBYY Text Analytics for Contracts is a Software as a Service solution that automatically discovers insights from contracts to speed content migration, obligation analysis and risk mitigation. Human-like understanding of contracts using advanced linguistic and AI capabilities lets users speed read contracts by pinpointing sections, clauses and entities. Customers leverage ABBYY Text Analytics for Contracts modular micro-service, cloud-based architecture to customize processing capabilities as well as discovery, review and analysis workflows.
Identify and migrate relevant sections from contracts, leases, regulatory filings and more – that other systems cannot.
Focus on the facts from contracts and leases using advanced NLP technology to manage obligations.
Analyze variance and risk between contract sections and clause libraries.
Transform stored documents into business-critical assets.
Empower your CLM through automated section identification and classification powered by human-like understanding.
Connect business intelligence in your documents to enterprise systems that drive your business.
Provide enterprise decision-makers the business intelligence they need.
Utilize workflows that work how you want them to – not the other way around.
Snap in modules when you need them, including ABBYY industry leading technologies and third-party tools.
Assess compliance with specific regulatory sections, articles and requirements.
Identify compliance shortfalls that need to be addressed in your GRC and compliance guidelines.
Identify commitments that need to be honored in the event of a crisis, for example, a data breach notification.
Leverage ABBYY Text Analytics for Contracts' modular, extensible, and scalable architecture, which provides flexible micro-service based workflows for document processing as well as discovery, review and analysis to accelerate time-to-deployment and customer time-to-value.
Action contract-based information within Contract Lifecycle Management systems and other enterprise business processes.
Take advantage of how ABBYY Text Analytics for Contracts understands contracts and leases just like you do to automatically identify the terms, clauses and commitments that previous solutions could not – connecting contracts to critical business processes that drive revenue, reduce risk, or both.
Manage and mitigate your obligations and risks, before something goes wrong, based on compliance analysis that identifies gaps and obligations that need to be fulfilled in the event of a crisis.
ABBYY Text Analytics for Contracts reveals insights in contracts to speed content migration, obligation analysis and risk mitigation.
Why should you care about GDPR? The compliance journey starts and ends with information governance.
Intelligent Content Analytics to the rescue. How can enterprises leverage their critical content more efficiently and gain actionable insight?
Locked away in each and every document is the critical business intelligence needed to run the enterprise. How do you unlock the intelligence, and business value of documents?
An exploration of how the environment for information privacy and security has changed from AIIM.