/* By Dan Gries rectangleworld.com Uses: Processing (processing.org), Processing.js (processingjs.org), Box2D (Erin Catto http://www.gphysics.com), boxwrap2d.js (https://github.com/marcogillies/boxwrap2dJS) */ import org.jbox2d.p5.*; //the very basics of the physics library color bgColor; int[] lastDigits; int[] digits; float digitWidth; float digitHeight; float[] digitX; float digitY; float colonX; float digitSpacing; float colonWidth; float particleRadius; float seconds; float lastSeconds; ParticleDigit[] graphicalDigits; color[] digitColors; color colonColor; float particleMarginX; float particleMarginY; float[] fineFadeParam; float particleStepX; float particleStepY; int particleNumAcross; PGraphics[] overlayDigits; //color bgDigitsColor; float leadingOneNudgeRight; float allNudgeLeft; float allNudgeLeftMin; float allNudgeLeftMax; PGraphics gradientBackground; Physics physics; ArrayList> activeBodies; int maxNumBodiesPerType; color fadeColor; color edgeColor; color topGradColor; color bottomGradColor; float[] tweenParam; float[] tweenParamLin; float tweenParamInc; float tweenParamStart; //clock offset for testing and debugging - use only positive number. int addHours = 0; int addMinutes = 0; int fakeMinuteOffset = 24*60 + addHours*60 + addMinutes; void settings() { bgColor = 0xFF000000; digitWidth = 0.16*((float)width); digitHeight = 10.0/6.0*digitWidth; digitSpacing = 0.1*digitWidth; colonWidth = digitSpacing*3.2; digitY = 0.075*height; particleRadius = 0.07*digitWidth; particleStepX = 2*particleRadius; particleStepY = 2*particleRadius; particleNumAcross = 6; allNudgeLeftMin = 0; allNudgeLeftMax = 0.5*digitWidth; leadingOneNudgeRight = 0;//0.15*digitWidth; tweenParamStart = 0; maxNumBodiesPerType = 20; float tileAlpha = 255; digitColors = new color[4]; digitColors[0] = color(10, 160, 245, tileAlpha); digitColors[1] = color(245, 140, 0, tileAlpha); colonColor = color(90, 90, 90, tileAlpha); digitColors[2] = color(245, 30, 10, tileAlpha); digitColors[3] = color(0, 140, 30, tileAlpha); topGradColor = 0xFF333333; bottomGradColor = 0xFF000000; edgeColor = 0x88000000; fadeColor = bottomGradColor; } void createGradientBackground() { gradientBackground = createGraphics(width, height); SimpleVerticalGradient grad = new SimpleVerticalGradient(0,height,topGradColor,bottomGradColor); gradientBackground.beginDraw(); gradientBackground.background(bottomGradColor); gradientBackground.endDraw(); grad.fillRect(gradientBackground,0,0,width,0.7*height); } void setup() { size(800, 450); //size(displayWidth, displayHeight); //use this for full screen presentation mode //smooth(4); settings(); //place digits and colon //should nudge left, because leftmost digit is either empty or one. //also, leading one should be nudged a little right. digitX = new float[4]; allNudgeLeft = 0; placeDigits(); fineFadeParam = new float[4]; fineFadeParam[0] = 1; fineFadeParam[1] = 1; fineFadeParam[2] = 1; fineFadeParam[3] = 1; tweenParam = new float[4]; tweenParam[0] = 1; tweenParam[1] = 1; tweenParam[2] = 1; tweenParam[3] = 1; tweenParamLin = new float[4]; tweenParamLin[0] = 1; tweenParamLin[1] = 1; tweenParamLin[2] = 1; tweenParamLin[3] = 1; tweenParamInc = 1.0/45.0; /* println(fakeHour()); println(fakeMinute()); println(fakeSecond()); */ digits = new int[4]; lastDigits = new int[4]; createGradientBackground(); createOverlayDigits(); setUpPhysicsWorld(); createGraphicalDigits(); initializeTime(); drawDisplay(); } void placeDigits() { float margin = 0.5*(width - (4*digitWidth + colonWidth + 4*digitSpacing)); digitX[3] = margin - allNudgeLeft + leadingOneNudgeRight; digitX[2] = digitX[3] - leadingOneNudgeRight + digitWidth + digitSpacing; colonX = digitX[2] + digitWidth + digitSpacing; digitX[1] = colonX + colonWidth + digitSpacing; digitX[0] = digitX[1] + digitWidth + digitSpacing; } void setUpPhysicsWorld() { physics = new Physics(this, width, height, 0, -10, width*2, height*2, width, height, 100); physics.setDensity(10.0); physics.setRestitution(0.3); physics.setFriction(0.4); activeBodies = new ArrayList>(); for (int i = 0; i < 4; i++) { activeBodies.add(new ArrayList()); } physics.setCustomRenderingMethod(this, "myCustomRenderer"); } void draw() { int i; //store last digits for (i = 0; i < 4; i++) { lastDigits[i] = digits[i]; lastSeconds = seconds; } setFineFadeParams(); //get current digits timeToDigits(); updateDigitParticles(); setTweenParams(); removeExcessBodies(); //drawDisplay(); } void setTweenParams() { float tmp; for (int i =0; i < 4; i++) { tmp = tweenParamLin[i] + tweenParamInc; tmp = (tmp > 1) ? 1 : tmp; tweenParamLin[i] = tmp; //easing if (tmp < 1) { tmp = 0.5 - 0.5*cos(PI*tmp); } tweenParam[i] = tmp; } } void setFineFadeParams() { fineFadeParam[0] -= 1/frameRate; fineFadeParam[1] -= 1/(frameRate*10); fineFadeParam[2] -= 1/(frameRate*60); fineFadeParam[3] -= 1/(frameRate*1200); for (int i = 0; i < 4; i++) { if (fineFadeParam[i] == 0) { fineFadeParam[i] = 0; } } } void removeExcessBodies() { for (int i = 0; i < 4; i++) { if (activeBodies.get(i).size() > maxNumBodiesPerType) { physics.removeBody(activeBodies.get(i).remove(0)); } } } void removeParticleAndCreateBody(int index) { Particle2D p = graphicalDigits[index].removeParticle(floor(random(graphicalDigits[index].particles.size()))); //activeBodies.get(index).add(physics.createCircle(p.x, p.y, 6)); Body b = physics.createRect(p.x-particleRadius, p.y-particleRadius, p.x+particleRadius, p.y+particleRadius); //b.setAngle(-p.angle); b.setAngle(p.angle); //JS version handles angles differently activeBodies.get(index).add(b); fineFadeParam[index] = 1; } void removeParticleOnly(int index) { graphicalDigits[index].removeParticle(floor(random(graphicalDigits[index].particles.size()))); fineFadeParam[index] = 1; } void updateDigitParticles() { //see what has changed and take action Particle2D p; float posX; float posY; if (lastSeconds != seconds) { //first digit - always removing one particle within this block removeParticleAndCreateBody(0); if (seconds == 0) { //graphicalDigits[0].createParticlesRect(particleMarginX, particleMarginY, particleStepX, particleStepY, 6); graphicalDigits[0].createParticlesDigit(digits[0]); tweenParamLin[0] = 0; } //second digit if (seconds == seconds - (seconds % 10)) { removeParticleAndCreateBody(1); } if (digits[1] != lastDigits[1]) { //graphicalDigits[1].createParticlesRect(particleMarginX, particleMarginY, particleStepX, particleStepY, 6); graphicalDigits[1].createParticlesDigit(digits[1]); tweenParamLin[1] = 0; } //third digit //remove one each minute if (digits[0] != lastDigits[0]) { removeParticleAndCreateBody(2); } //refresh when digit should change if (digits[2] != lastDigits[2]) { //graphicalDigits[2].createParticlesRect(particleMarginX, particleMarginY, particleStepX, particleStepY, 6); graphicalDigits[2].createParticlesDigit(digits[2]); tweenParamLin[2] = 0; } //fourth digit //remove one every three minutes, when between 10:00 and 12:00 if ((lastDigits[3] == 1)&&(digits[0] != lastDigits[0])&&(fakeMinute() % 3 == 0)) { removeParticleAndCreateBody(3); } //refresh when exactly 10:00 //print("digits[2] = " + digits[2]); //print(" lastDigits[2] = " + digits[2]); //print(" digits[3] = " + digits[3]); //println(""); if ((digits[2] != lastDigits[2])&&(digits[3] == 1)) { //graphicalDigits[3].createParticlesRect(particleMarginX, particleMarginY, particleStepX, particleStepY, 6); graphicalDigits[3].createParticlesDigit(digits[3]); tweenParamLin[3] = 0; } } } void timeToDigits() { int hour = fakeHour() % 12; if (hour == 0) { hour = 12; } digits[0] = fakeMinute() % 10; digits[1] = floor((fakeMinute() - digits[0])/10); digits[2] = hour % 10; digits[3] = floor((hour - digits[2])/10); seconds = fakeSecond(); } void initializeTime() { int i; int numToRemove; timeToDigits(); numToRemove = fakeSecond(); for (i = 0; i < numToRemove; i++) { if (i < maxNumBodiesPerType-1) { removeParticleAndCreateBody(0); } else { removeParticleOnly(0); } } float minuteOnes = fakeMinute() % 10; numToRemove = floor((60*minuteOnes + (float)fakeSecond())/10); for (i = 0; i < numToRemove; i++) { if (i < maxNumBodiesPerType-1) { removeParticleAndCreateBody(1); } else { removeParticleOnly(1); } } for (i = 0; i < fakeMinute(); i++) { if (i < maxNumBodiesPerType-1) { removeParticleAndCreateBody(2); } else { removeParticleOnly(2); } } int hour = fakeHour() % 12; if (hour == 0) { hour = 12; } float hourTens = floor(((float)hour)/10); //%12 is for USA time if (hourTens == 0) { graphicalDigits[3].clearAllParticles(); } else { float minutesAfter10 = ((float) hour - 10)*60 + fakeMinute(); numToRemove = floor(minutesAfter10/3); for (i = 0; i < numToRemove; i++) { if (i < maxNumBodiesPerType-1) { removeParticleAndCreateBody(3); } else { removeParticleOnly(3); } } } } void drawDisplay() { int i; //background(bgColor); image(gradientBackground,0,0); //positioning float nudgeEase = 0.1; if (digits[3] != 0) { allNudgeLeft = allNudgeLeft + nudgeEase*(allNudgeLeftMin - allNudgeLeft); } else { allNudgeLeft = allNudgeLeft + nudgeEase*(allNudgeLeftMax - allNudgeLeft); } placeDigits(); graphicalDigits[3].x = digitX[3]; graphicalDigits[2].x = digitX[2]; graphicalDigits[1].x = digitX[1]; graphicalDigits[0].x = digitX[0]; //draw digits for (i = 0; i < 4; i++) { graphicalDigits[i].drawMe(tweenParam[i]*graphicalDigits[i].particleRadius); } //draw colon float cx = colonX + colonWidth/2; float cy = digitY + 0.525*digitHeight; float colonRad = colonWidth*0.35; float yOffset = colonRad*1.7; noStroke(); fill(colonColor); ellipseMode(RADIUS); ellipse(cx, cy-yOffset, colonRad, colonRad); ellipse(cx, cy+yOffset, colonRad, colonRad); drawOverlayDigits(); //frames for testing /* stroke(64); noFill(); for (i = 0; i < 4; i++) { rect(graphicalDigits[i].x, graphicalDigits[i].y, digitWidth, digitHeight); line(graphicalDigits[i].x + digitWidth/2, graphicalDigits[i].y, graphicalDigits[i].x + digitWidth/2, graphicalDigits[i].y + digitHeight); } */ //for testing //printTime(); //printTimeByDigits(); } void createGraphicalDigits() { int i; graphicalDigits = new ParticleDigit[4]; timeToDigits(); for (i = 0; i < 4; i++) { graphicalDigits[i] = new ParticleDigit(digitX[i], digitY); graphicalDigits[i].particleRadius = particleRadius; graphicalDigits[i].particleColor = digitColors[i]; particleMarginX = 0.5*(digitWidth - (particleNumAcross - 1)*particleStepX); particleMarginY = 0.5*(digitHeight - 9*particleStepY); //graphicalDigits[i].createParticlesRect(particleMarginX, particleMarginY, particleStepX, particleStepY, 6); graphicalDigits[i].createParticlesDigit(digits[i]); } } class ParticleDigit { ArrayList particles; float x; float y; int numParticles; color particleColor; float particleRadius; private int i; float fallInterval; ParticleDigit(float _x, float _y) { x = _x; y = _y; numParticles = 60; particleColor = color(50, 150, 255); particleRadius = 6; } void createParticlesRect(float xMargin, float yMargin, float xStep, float yStep, int numAcross) { float x1; float y1; particles = new ArrayList(); for (i = 0; i < numParticles; i++) { x1 = xMargin + x + ((float)(i % numAcross))*xStep; y1 = yMargin + y + floor(((float) i)/((float) numAcross))*yStep; particles.add(new Particle2D(x1, y1, 0, particleRadius, particleColor)); } } void createParticlesDigit(int which) { float x1; float y1; float rot; particles = new ArrayList(); float xOffset = xOffsets[which]; for (i = 0; i < 180; i += 3) { x1 = digitWidth/2 + 2*particleRadius*(tileData[which][i] + xOffset); y1 = digitHeight/2 + 2*particleRadius*tileData[which][i+1]; rot = tileData[which][i+2]; particles.add(new Particle2D(x1, y1, rot, particleRadius, particleColor)); } } Particle2D removeParticle(int which) { Particle2D p = particles.remove(which); p.x += x; p.y += y; return p; } void clearAllParticles() { particles = new ArrayList(); } void drawMe(float rad) { int len = particles.size(); for (i = 0; i < len; i++) { particles.get(i).drawMe(x,y,rad); } } } void createOverlayDigits() { int i; float x1; float y1; float rot; int n; float xOffset; overlayDigits = new PGraphics[10]; for (n = 0; n < 10; n++) { PGraphics pg = createGraphics(floor(digitWidth), floor(digitHeight)); xOffset = xOffsets[n]; pg.beginDraw(); for (i = 0; i < 180; i += 3) { x1 = digitWidth/2 + 2*particleRadius*(tileData[n][i] + xOffset); y1 = digitHeight/2 + 2*particleRadius*tileData[n][i+1]; rot = tileData[n][i+2]; pg.rectMode(RADIUS); pg.noStroke(); pg.fill(255); pg.pushMatrix(); pg.translate(x1, y1); pg.rotate(rot); pg.rect(0, 0, 0.95*particleRadius, 0.95*particleRadius); pg.popMatrix(); pg.rectMode(CORNER); } pg.endDraw(); pg = applyVerticalGradient(pg, 0xFF000000, 0xFFFFFFFF); pg = blueToAlpha(pg,0xFFFFFFFF, 0, 110); overlayDigits[n] = pg; } } void drawOverlayDigits() { int i; for (i = 0; i < 4; i++) { if ((i < 3) || (digits[i] != 0)) { image(overlayDigits[digits[i]], digitX[i], digitY); } } } class Particle2D { float x; float y; color col; float radius; float angle; Particle2D(float _x, float _y, float _angle, float _radius, color _col) { x = _x; y = _y; radius = _radius; col = _col; angle = _angle; } /* void drawMe() { ellipseMode(RADIUS); noStroke(); fill(col); ellipse(x, y, radius, radius); } */ void drawMe(float _x, float _y, float rad) { rectMode(RADIUS); noStroke(); //stroke(0,0,0,48); fill(col); pushMatrix(); translate(_x+x, _y+y); rotate(angle); rect(0, 0, rad, rad); popMatrix(); rectMode(CORNER); } } String timeString() { String str = ""; int hour = fakeHour() % 12; if (hour == 0) { hour = 12; } if (hour < 10) { str += "0"; } str += hour; str +=":"; if (fakeMinute() < 10) { str += "0"; } str += fakeMinute(); str +=":"; if (fakeSecond() < 10) { str += "0"; } str += fakeSecond(); if (fakeHour() > 12) { str += " PM"; } else { str += " AM"; } return str; } void printTime() { textSize(16); fill(255); textAlign(RIGHT); text(timeString(), width, 20); } void printTimeByDigits() { String str; int hour = fakeHour() % 12; if (hour == 0) { hour = 12; } int hourTens = floor(((float)hour)/10); int hourOnes = hour % 10; int minTens = floor(((float)fakeMinute())/10); int minOnes = fakeMinute() % 10; textAlign(CENTER); rectMode(CENTER); text(hourTens, digitX[3] + digitWidth/2, digitY - 20); text(hourOnes, digitX[2] + digitWidth/2, digitY - 20); text(minTens, digitX[1] + digitWidth/2, digitY - 20); text(minOnes, digitX[0] + digitWidth/2, digitY - 20); rectMode(CORNER); } void myCustomRenderer(World world) { int i; int j; int len; noStroke(); //stroke(255,255,255,64); ArrayList bodyList; Vec2 worldCenter; Vec2 pos; float angle; color baseColor; float fadeParam; //float fadeRate = 1/maxNumBodiesPerType; //draw other parts of the display drawDisplay(); //stroke(edgeColor); strokeWeight(0.5); noStroke(); rectMode(RADIUS); for (i = 0; i < 4; i++) { bodyList = activeBodies.get(i); len = bodyList.size(); baseColor = digitColors[i]; for (j = 0; j < len; j++) { fadeParam = ((float)(len-1-j) + 1 - fineFadeParam[i])/((float)maxNumBodiesPerType); fadeParam = (fadeParam < 0) ? 0 : ((fadeParam > 1) ? 1 : fadeParam); fill(lerpColor(baseColor, fadeColor, fadeParam)); worldCenter = bodyList.get(j).getWorldCenter(); pos = physics.worldToScreen(worldCenter); angle = physics.getAngle(bodyList.get(j)); pushMatrix(); translate(pos.x, pos.y); rotate(-angle); rect(0, 0, 0.95*particleRadius, 0.95*particleRadius); popMatrix(); } } rectMode(CORNER); } int fakeSecond() { return second(); } int fakeMinute() { return (minute() + fakeMinuteOffset) % 60; } int fakeHour() { int h = (hour() + floor(((float) minute() + fakeMinuteOffset)/60)) % 24; if (h == 0) { h = 12; } return h; } PGraphics blueToAlpha(PImage sourceImage, int baseColor, float alphaMin, float alphaMax) { float blueNorm; float alphaNorm; float newAlpha; int i; int len; int c; PGraphics destinationImage = createGraphics(sourceImage.width, sourceImage.height); int baseColorWithoutAlpha = baseColor & 0xFFFFFF; sourceImage.loadPixels(); destinationImage.loadPixels(); len = sourceImage.pixels.length; for (i = 0; i < len; i++) { c = sourceImage.pixels[i]; blueNorm = ((float)(c & 0xFF))/255; alphaNorm = ((float)((c >> 24) & 0xFF))/255; newAlpha = alphaNorm*(alphaMin + blueNorm*(alphaMax-alphaMin)); destinationImage.pixels[i] = (floor(newAlpha) << 24) | baseColorWithoutAlpha; } destinationImage.updatePixels(); return destinationImage; } PGraphics applyVerticalGradient(PImage sourceImage, int topColor, int bottomColor) { //preserves alpha int i; int j; int w; int h; int index; int c; int newColorWithoutAlpha; int alpha; float param; PGraphics destinationImage = createGraphics(sourceImage.width, sourceImage.height); sourceImage.loadPixels(); destinationImage.loadPixels(); w = sourceImage.width; h = sourceImage.height; for (j = 0; j < h; j++) { for (i = 0; i < w; i++) { index = i + j*w; c = sourceImage.pixels[index]; alpha = (c >> 24) & 0xFF; param = ((float)j)/((float) h); newColorWithoutAlpha = lerpColor(topColor, bottomColor, param); destinationImage.pixels[index] = (alpha << 24) | (newColorWithoutAlpha & 0xFFFFFF); } } destinationImage.updatePixels(); return destinationImage; } class SimpleVerticalGradient { int startColor; int endColor; float startY; float endY; SimpleVerticalGradient(float _startY, float _endY, int _startColor, int _endColor) { startY = _startY; endY = _endY; startColor = _startColor; endColor = _endColor; } void fillRect(PGraphics pg, float rectX, float rectY, float rectW, float rectH) { int i; int step; float y0; float y1; int color0; int color1; float yStep = 1; float ratio; float y; int col; if (startY < endY) { y0 = startY; y1 = endY; color0 = startColor; color1 = endColor; } else { y1 = startY; y0 = endY; color1 = startColor; color0 = endColor; } pg.beginDraw(); pg.noFill(); pg.strokeWeight(1); for (y = rectY; y < rectY + rectH; y += yStep) { ratio = (y - rectY)/rectH; ratio = (ratio < 0) ? 0 : ((ratio > 1) ? 1 : ratio); col = lerpColor(color0,color1,ratio); pg.stroke(col); pg.line(rectX,y,rectX+rectW,y); } pg.endDraw(); } } float[][] tileData = {{ -0.36794972, -3.1963298, 1.3499032, -0.39024997, 3.21863, -1.3499032, 0.42741466, 3.21863, 1.3499032, 0.40511513, -3.21863, -1.3499032, -1.4086161, -2.2002647, -1.1290094, -1.3640163, 2.2671654, 1.1290094, 1.4011803, 2.2894642, -1.1290094, 1.4011803, -2.267165, 1.1290094, -1.9809816, -1.9549649, -0.6135922, -2.1816816, 1.2413657, -1.0308343, 2.1742458, 1.4197655, -0.34361178, 2.0404472, -1.7765651, -1.0553781, -1.0518157, -2.7503307, -0.8222132, -0.87341523, 2.8618305, 0.68722314, 0.91058064, 2.8618305, -0.68722314, 0.91058064, -2.86183, 0.68722314, 2.3080473, -2.5719304, 1.0185624, 2.2857463, 2.6165307, -1.06765, -2.2485824, 2.5942304, 1.1167375, -2.315483, -2.5719304, -1.0308343, -0.39024997, -3.768696, -0.11044659, -0.39024997, 3.7686968, 0.11044659, 0.42741466, 3.7686968, -0.11044659, 0.42741466, -3.768696, 0.11044659, -2.4864478, 1.917798, -0.18407771, -2.5756474, -1.9177988, 0.22089326, 2.5682116, -1.9177988, -0.22089326, 2.5236125, 2.0292985, 0.31906807, -2.241148, 0.14866662, 0.79766953, -2.2188492, -0.9291662, -0.66267955, 2.233713, -0.7730663, -0.80994135, 2.2114127, 0.37166762, -0.5031458, -1.1856158, -3.5679963, -0.3804273, -1.1856158, 3.5679967, 0.3804273, 1.2227812, 3.5679967, -0.3804273, 1.2227812, -3.5679963, 0.3804273, -1.8025832, 3.1442971, 0.7853977, -1.8248835, -3.1442971, -0.76085407, 1.817447, -3.1442971, 0.7731259, 1.8397472, 3.1888976, -0.68722314, -2.6945815, -1.4271988, 0.159534, -2.6499803, 1.4494987, -0.17180586, 2.664847, 1.516398, 0.12271846, 2.6871471, -1.4717989, -0.12271846, -1.5870152, -1.4940984, 0.17180586, -1.5870152, 1.5386989, -0.18407771, 1.6464808, 1.5609984, 0.17180586, 1.5795794, -1.5386982, -0.20862141, -2.7763474, -0.6764324, 0.098174766, -2.7540472, 0.7433317, -0.098174766, 2.7689123, 0.7656319, 0.098174766, 2.7689123, -0.6764324, -0.049087383, -1.6539159, -0.6318326, 0.06135923, -1.6985164, 0.6987319, -0.098174766, 1.7133808, 0.7433317, 0.098174766, 1.6910813, -0.6764324, -0.08590293, -2.7912147, 0.037166834, 0.0, -1.6836483, 0.059467077, 0.0, 1.7059479, -0.0074329376, 0.0, 2.7912147, 0.059467077, 0.0 }, { 0.23748136, -3.1367311, -0.8467569, -0.15832114, -2.701349, -0.625864, -0.61349416, -2.3847077, -0.4786021, 0.118739605, -2.0086958, 0.7853977, -1.0884554, -1.0785617, 1.0921937, -1.8009002, -1.2566718, -0.08590292, -1.8404789, -1.7118444, -0.061359234, -1.6425784, -1.8899549, 1.1535531, -1.128037, -2.1076462, 1.1044656, -0.4155922, -1.5535237, 0.88357234, 0.4683659, 3.2158902, 0.0, 1.1940014, 3.255471, 0.0, 1.8404782, 3.3148394, 0.0, 0.5079446, -1.1973013, 0.0, 0.4881556, 2.7475243, 0.0, 1.154422, 2.7475243, 0.0, 1.8206892, 2.7475243, 0.0, 1.8338814, -0.73553216, 0.0, 1.1808093, -0.590405, 0.0, 1.8404782, 2.1999981, 0.0, 1.2137918, 2.1999981, 0.0, 0.4881556, 2.1999981, 0.0, 0.4881556, 1.5733134, 0.0, 1.1742125, 1.6524714, 0.0, 1.8404782, 1.5931016, 0.0, 0.4881556, -0.60359824, 0.0, 1.8338814, -0.16161919, 0.0, 1.8404782, 0.9466256, 0.0, 1.1940014, 1.0455762, 0.0, 0.4881556, 1.104946, 0.0, 0.4881556, -0.05607283, 0.0, 1.233583, 0.4980501, 0.0, 1.8404782, 0.41888988, 0.0, 1.1808093, -0.05607283, 0.0, 0.4947517, 0.54422843, 0.0, 1.1676142, -1.1577215, 0.0, 1.8404775, -1.1577215, 0.0, 1.8404775, -2.364918, 0.0, 1.1676142, -2.364918, 0.0, 0.474962, -2.3055463, 0.0, 0.45517302, -2.9388301, 0.0, 1.1280355, -2.7805092, 0.0, 1.8404775, -2.7409294, 0.0, 1.8404775, -3.4137926, 0.0, 0.4947517, -1.771215, 0.0, 1.1676142, -1.7514246, 0.0, 1.8404775, -1.771215, 0.0, 1.1676142, -3.3940024, 0.0, 0.5739119, -3.6116939, 0.51541764, 0.8707638, -3.7304344, 0.0, 1.5832071, -3.7502239, 0.0, 1.8404775, -3.7502239, 0.0, -0.21769238, -1.7118444, 1.0062906, -1.4446771, -0.9004508, 1.2762719, -0.6926544, -1.3160427, 0.908116, -1.128037, -1.5931034, 1.0553781, 0.4947517, 3.750224, 0.0, 1.1874061, 3.750224, 0.0, 1.8404775, 3.750224, 0.0, -1.7613187, -0.82128954, -0.11044662 }, { -0.36434197, -2.8309438, 1.3499032, 0.371629, -2.8528056, -1.3499032, -1.2752008, -2.0731118, -1.1290094, 1.3480668, -1.9200876, 1.264, -1.748846, -2.422881, 0.20862141, 2.4775307, -2.510323, -0.5031458, -0.9472904, -2.5686173, -0.68722314, 0.95457816, -2.5904782, 0.68722314, -2.186059, -2.9839685, -0.78539777, -0.21132016, -3.7418025, -0.073631056, 0.5902362, -3.6762202, 0.22089323, -2.0038855, -1.7014818, 0.24543697, -1.034734, -3.5887785, -0.26998064, 1.3480668, -3.435754, 0.3804273, -1.7269857, -3.326452, -0.52768946, 1.9747388, -3.0859852, 0.7363104, -2.5795476, -2.4957497, 0.5031458, -1.4719455, -1.5776049, 0.26998067, -2.1131895, 2.2552836, 0.69949496, -2.1204765, 3.0641263, 0.31906807, -1.406363, 2.8236587, 0.073631085, -0.51736665, 2.845519, -0.024543695, 1.2169061, 3.7418025, 0.0, 1.9747388, 2.845519, 0.0, -1.6176825, 1.7597773, 0.8222132, -1.0565944, 1.2788444, 0.8958441, -0.38620234, 1.8472202, 0.7976696, 0.3934908, 2.8528068, 0.0, 1.151325, 2.8746672, 0.0, 1.3845041, -2.7653627, 0.68722314, 0.087442875, 1.439156, -0.6626795, -0.53194, 0.87078094, -0.6504077, 0.05100918, 0.4117098, -0.63813585, 0.5683737, 1.1331074, -0.5645049, 1.2096183, 0.6594615, -0.63813585, 1.748846, 0.20038962, 0.76085407, 2.6378446, -1.0456645, 0.23316512, 1.1148906, -0.6448864, 0.72403866, 1.6322565, -0.6667471, 0.42951474, 2.3026478, -0.40441918, 0.6626795, 1.3917904, -1.2934173, 0.31906807, 2.3026478, -1.3808599, 0.0, 2.6888509, -1.8399317, -0.12271846, 1.355356, -0.03278947, -0.6749513, 2.798154, 2.845519, 0.0, -2.5285406, 2.8600945, 0.45405844, -2.7325723, 3.6907961, 0.024543695, -1.9310174, 3.7126565, 0.0, -1.0638807, 3.7126565, 0.0, 0.5246544, 3.7345161, 0.0, 2.0403206, 3.7345161, 0.0, 2.776293, 3.7345161, 0.0, 0.6266699, -0.08379793, -0.7240386, 1.9674525, -2.2261357, -0.28225252, -0.28418827, 3.719942, 0.0, -1.4646592, -3.1005588, -0.68722314, -2.798154, -1.8836528, -1.4112626, -0.8598497, 2.3573005, -1.1290094, -1.515667, 2.3354394, -1.1290094, -2.6815646, 3.3847454, -1.4112626 }, { -2.2179887, -2.3608541, 0.20862141, -2.2394185, 2.2108455, -0.25770882, -1.239358, -2.7823071, -0.7240386, -1.3036487, 2.7608771, 0.7240386, -0.6678965, -3.103755, -0.23316512, -0.71075606, 3.1680436, 0.40497103, 0.16072512, -3.1466148, 0.23316512, 0.18215275, 3.275194, -0.061359234, 0.8179071, -2.803737, -0.5645049, 1.0322042, 2.9751756, 0.79766953, 1.6250968, -3.4466324, 0.4295147, 1.6250968, 3.4466336, -0.4295147, 2.0751235, -3.068039, 0.9326596, 2.1394136, 3.0680408, -0.9326596, 1.0964949, -1.9965466, 0.0, 1.4608018, 1.3965111, -0.14726216, 1.5250905, -1.5750929, 0.0, 1.7608194, 1.0393481, -0.0, 0.689327, -0.25358677, 0.0, 1.117924, 0.55360436, 0.908116, 0.41788173, -0.8321911, 1.0799218, 0.5250313, 0.08214712, -1.2885438, -0.28215766, -0.5964632, 0.07363108, -0.3035903, -0.04643154, 0.073631085, 1.5608075, 0.14643645, 1.8626451E-9, 1.5179472, -0.7464727, -0.0, 2.6323, 0.8464794, 1.0799218, 1.9894037, -1.1893566, -0.7363104, 2.1108384, 2.3037086, 0.23316512, 2.3465674, -2.4537177, -0.18407771, -2.410856, 2.9537473, -0.69949496, -2.3037086, -2.9537466, 0.7117668, -1.8179641, -3.3966293, -0.5399613, -1.9036839, 3.39663, 0.5399613, -1.2036424, -3.6537876, -0.25770882, -1.2250721, 3.653788, 0.25770882, 0.096434355, -3.760937, 0.0, 0.096434355, 3.760937, -0.0, 0.92505527, -3.6752172, 0.17180586, 0.86076593, 3.696647, -0.17180586, 0.80361843, -1.210786, -1.0062906, 2.7108736, 2.1751285, 1.8530504, 1.4465139, 2.125127, 0.24543697, 1.5536628, -2.253705, -0.0, -2.5751517, -2.425144, 0.24543697, -2.7680206, 2.3822844, -0.3558836, -1.5179458, -2.1894152, 0.24543697, -1.6250954, 2.0608363, -0.24543697, 1.63224, -2.9966054, -0.24543697, 1.63224, 2.8894565, 0.24543697, -1.7822485, -2.8608837, -0.51541764, -1.7822485, 2.7537346, 0.51541764, 2.4180021, 2.7537346, -0.89584416, 1.8393939, 0.096434355, -1.1780969, -0.5393164, -3.7395072, -0.073631085, -0.5393164, 3.760937, 0.073631085, 2.3251376, -1.7679609, -1.2885438, 2.3251376, 1.5322344, 1.472622, 2.768021, 1.4965167, 1.8626451E-9, 2.3179944, 0.41073918, -0.8222132 }, { 1.6108081, 3.6966476, 0.0, 1.0179169, 3.7180774, 0.0, 2.0822654, 3.6823604, 0.0, 1.3822246, 2.9751763, 0.0, 2.1036944, 3.00375, 0.0, 0.99648786, 2.9394593, 0.0, 3.1251855, 2.1679845, 0.0, 2.6322978, 2.1536987, 0.0, 1.9536874, 2.1965597, 0.0, 1.1679268, 2.1536987, 0.0, 0.646466, 1.303648, 0.0, -0.20358467, 1.303648, 0.0, 1.0179169, 0.5821781, 0.0, 1.7822471, 0.6036093, 0.0, 2.0822654, 0.5250306, 0.0, 1.0179169, -0.16072333, 0.0, 1.0179169, -0.9250556, 0.0, 1.63224, -0.1750102, 0.0, 1.739389, -1.0893499, 0.0, 1.0179169, -1.7108155, 0.0, 2.075122, -1.9751168, 0.0, -0.93934107, 1.303648, 0.0, -2.93946, 0.7036135, -0.87130046, -2.4037135, 1.3393657, 0.0, -1.6608131, 1.317936, 0.0, 3.1251855, 1.310792, 0.0, 2.3179936, 1.3322217, 0.0, 1.489372, 1.3322217, 0.0, -2.425144, 2.1894164, 0.0, -3.1251855, 1.4608011, 0.0, -3.1251855, 2.1608412, 0.0, -1.6536705, 2.1822739, 0.0, -0.91076875, 2.1608412, 0.0, -0.25358677, 2.1822739, 0.0, 0.48931503, 2.1608412, 0.0, -3.1251855, 1.2107863, 0.0, 1.6108081, -1.9179711, 0.0, 2.075122, -1.11078, 0.0, 2.075122, -0.23929954, 0.0, 1.6393819, -2.7894504, 0.0, 1.0393474, -2.5751526, 0.0, 1.7179577, -3.7037902, 0.0, -2.4680028, 0.14643574, -0.87130046, -1.9822605, -0.46788418, -0.87130046, -1.532233, -0.98220026, -0.87130046, -0.6393235, -2.0251203, -0.87130046, -1.0679212, -1.5108039, -0.87130046, 0.6393235, -2.468003, -0.87130046, 0.23215628, -3.060895, -0.87130046, -2.0679796, 0.65361214, -0.87130046, -1.532233, 0.039288282, -0.87130046, -0.98220134, -0.5964632, -0.87130046, -0.44645405, -1.2179292, -0.87130046, 0.1035769, -1.8751112, -0.87130046, -0.1750102, -2.5751526, -0.87130046, 1.0393474, -3.4609194, 0.0, 0.6107497, -3.5252087, -0.8467569, 1.0536332, -3.696647, 0.0, 2.0822654, -3.718077, 0.0, 2.0679789, -2.853741, 0.0 }, { -2.2726336, 2.1571999, -0.25770882, -1.3275075, 2.7127318, 0.7240386, -0.7286868, 3.123971, 0.40497103, 0.17315412, 3.2321885, -0.061359234, 0.9451289, 2.8642387, 0.79766953, 1.5439489, 3.3836997, -0.49087396, 2.0850534, 3.001321, -0.8099414, 1.5078764, 1.2697892, 0.012271875, 1.9191148, 0.7142565, 1.8626451E-9, 1.291435, 0.39680815, 1.1167375, 2.777667, 0.7575445, 1.4603502, 2.1211267, 2.2509913, 0.23316512, -2.445787, 2.9075289, -0.69949496, -1.9335408, 3.3548405, 0.5399613, -1.2481434, 3.6145713, 0.25770882, 0.08657813, 3.7227917, -0.0, 0.8585522, 3.657858, -0.17180586, 2.6838741, 2.1211267, 1.8775941, 1.428513, 2.0706232, 0.24543697, -2.8065226, 2.3303525, -0.3558836, -1.6521678, 2.00569, -0.24543697, 1.6377411, 2.8425965, 0.24543697, -1.8108923, 2.7055163, 0.51541764, 2.3664265, 2.662229, -0.9203878, 2.1499858, -0.43288207, -0.8590287, -0.555532, 3.7227917, 0.073631085, 2.3375666, 1.4718018, 1.472622, 2.8065233, 1.4140842, 0.024543695, 2.590082, 0.14429426, -0.4172429, 2.41693, -3.7227917, 0.012271875, 2.41693, -2.986891, 0.012271875, 1.5511651, -3.7227917, 0.012271875, 1.52952, -3.0085351, 0.012271875, 0.6853974, -3.7227917, 0.012271875, 0.6853974, -3.0085351, 0.012271875, -0.20201182, -3.7227917, 0.012271875, -0.20201182, -3.0085351, 0.012271875, -1.0677774, -3.7227917, 0.012271875, -2.1066957, -3.65786, 0.15953404, -1.9768302, -3.7227917, 0.012271875, 0.4040258, -1.0172739, -1.583069, -0.3390491, -0.88740957, -0.3313399, 0.9884155, -0.97398627, 0.12271849, 0.38238, -0.41123843, -1.2762719, 1.6377411, -0.7791885, 0.4172429, -0.44009686, -0.49781513, -0.3067962, -2.2582047, -2.8137376, 0.15953404, -2.4097137, -1.9263282, 0.15953404, -2.5395777, -1.038919, 0.15953404, -2.6910868, -0.15150976, 0.15953404, -1.5439467, -1.7531751, 0.15953404, -1.7171009, -0.88740957, 0.15953404, -1.8469663, -0.021643639, 0.15953404, -1.3924384, -2.6405847, 0.15953404, -1.3058617, -3.0518231, 0.15953404, -1.0028436, -3.0085351, 0.0, 1.6593854, -0.06493163, -0.28225252, 0.9884155, -0.06493163, -0.6626795, -0.9379113, -0.6276798, -0.47860214, -1.3058617, -0.10822034, -0.52768946 }, { -0.37166476, -3.2632298, 1.3499032, -0.37166476, 3.2632306, -1.3499032, 0.44599986, 3.2632306, 1.3499032, 0.44599986, -3.2632298, -1.3499032, -1.3008313, -2.222565, -1.1290094, -1.2562315, 2.222565, 1.1290094, 1.7096658, 2.088765, -1.1290094, 1.375165, -2.423265, 1.264, -1.8062975, -2.4455647, 0.20862141, -1.8062975, 2.4455645, -0.20862141, 0.36423254, -0.31963205, 0.061359234, 2.2820299, -2.6685643, -0.2822525, -0.8548322, -2.8618298, -0.68722314, -0.8548322, 2.8618305, 0.68722314, 1.3082657, 2.88413, -0.92038774, 0.9737656, -2.9064298, 0.68722314, -1.419764, 1.2636652, 1.5585252, 2.348932, 2.6165307, -1.1167375, -2.2522974, 2.6165307, 1.1167375, -2.2299979, -2.61653, -1.1167375, -0.37166476, -3.768696, -0.11044659, -0.37166476, 3.7686968, 0.11044659, 0.44599986, 3.7686968, -0.11044659, 0.44599986, -3.768696, 0.11044659, -2.4455624, 2.073899, -0.18407771, -2.4678626, -1.8954985, 0.18407771, 2.5867975, 1.9846988, 0.18407771, -1.9549634, 1.5758665, -0.1349903, -1.9549634, -1.5758657, 0.1349903, 1.783998, 1.508965, -0.08590292, -1.1670306, -3.5679963, -0.3804273, -1.1670306, 3.5679967, 0.3804273, 1.241365, 3.5679967, -0.3804273, 1.241365, -3.5679963, 0.3804273, -1.8062975, 3.2111971, 0.6749513, -1.7616978, -3.2111974, -0.6749513, 1.8806312, -3.2111974, 0.6749513, 1.8806312, 3.2111971, -0.6749513, -2.519896, -1.5163987, 0.12271846, -2.5421963, 1.4717989, -0.12271846, 2.6388302, 1.3379989, -0.049087383, -1.5238302, -1.5386982, 0.26998067, -1.5238302, 1.5386989, -0.17180586, 0.8399656, -0.66899943, 0.18407771, -2.6239629, -0.6764324, 0.098174766, -2.6239629, 0.6764324, -0.098174766, 2.475297, 0.5203328, -0.33133993, -1.6799312, -0.6764324, 0.098174766, -1.6799312, 0.6764324, -0.098174766, 1.6427658, 0.6764324, -0.39269918, -2.6388302, 0.037166834, 0.0, -1.6873634, 0.059467077, 0.0, 1.4717989, -0.4980322, 0.3804273, 2.133366, -0.07433295, -0.8099414, 1.1373003, 0.029733181, 0.6504077, -0.34936452, -0.14123225, -0.47860217, -1.085264, 0.36423326, 0.8099414, 0.22299957, -0.6466992, -0.28225255, -0.43856692, -0.3567996, -0.51541764, -0.96633124, 0.014867306, -0.699495 }, { -1.6073921, -2.6030927, 0.0, -1.0228872, -2.6030927, 0.0, 0.22768307, -2.6098897, 0.0, 0.7510221, -2.6098897, 0.0, -0.3772123, -2.6030927, 0.0, 0.78500605, -1.9981967, 0.4663303, -1.9540186, -3.2555645, 0.0, 1.4102912, -1.8962477, 0.0, -1.1452246, -3.2147856, 0.0, 1.4238846, -2.5283303, 0.0, -0.29565167, -3.174006, 0.0, 2.2054918, -3.235175, 0.0, 2.817185, -2.9769053, 0.0, 2.0083916, -2.50794, 0.0, 1.213191, -1.3525203, 0.0, 0.4247861, -1.3525203, 0.51541764, 0.89375067, -0.01359272, -1.1167375, 0.7374301, -0.5845059, -1.0062906, 0.58790374, 0.652472, -1.0921937, -0.13933182, 0.754421, 0.36815548, -0.7646184, 0.95831895, 0.34361178, 0.38400722, 1.2573695, 0.35588363, -0.22089171, 1.5428252, 0.23316512, -0.9481244, 1.461266, 0.33133993, 0.15971947, 1.9234343, 0.17180586, -0.057769775, 2.2292805, 0.0, -0.72383595, 2.2700593, 0.0, -1.1248362, 1.9846044, 0.29452437, 0.02378726, 2.7322261, 0.159534, -0.72383595, 2.8341773, 0.07363108, -1.267564, 2.5691092, 0.20862141, -0.078161, 3.337125, 0.0, -0.8461747, 3.3982937, 0.0, -1.4102912, 3.2147849, 0.1349903, 1.6753578, -1.3933003, 0.6135922, -2.1986978, -2.596296, 0.0, -2.817185, -2.6370757, 0.0, -2.8035922, -3.1468194, 0.0, 0.5335314, -3.187599, 0.0, 1.1995969, -3.2283785, 0.0, 1.7433243, -3.248768, 0.0, 2.6336782, -2.596296, -0.76085407, -0.13933182, -0.33303308, -1.1290094, -0.49954963, 0.3262353, -1.1290094, 0.25487137, 0.047575593, 0.47860214, 2.8103871, -3.6361735, 0.0, 1.7501185, -3.6429706, 0.0, 2.1171362, -1.9981967, 0.6504077, 0.13932824, -0.81559, 0.52768946, -2.8103888, -3.6565633, 0.0, -2.0015953, -3.6361735, 0.0, -1.2267845, -3.6361735, 0.0, -0.404397, -3.6361735, 0.0, 0.37041235, -3.6361735, 0.0, 1.1384261, -3.6361735, 0.0, 2.2734575, -3.6361735, 0.0, -1.4510715, 3.6565633, 0.0, -0.72383595, 3.6565633, 0.0, -0.057769775, 3.6565633, 0.0, 1.2675612, -0.7136414, 0.5399613 }, { -0.37109327, -3.300781, 1.3499032, -0.44140577, 3.2539058, -1.3499032, 0.41796827, 3.2539058, 1.3499032, 0.30078077, -3.253906, -1.3499032, -1.4414055, -2.4882812, -1.1290094, -1.4882805, 2.2539067, 1.1290094, 1.511718, 2.2539067, -1.1290094, 1.371093, -2.4648438, 1.1290094, -1.925781, 2.5585942, -0.20862141, 1.9023435, 2.5585942, 0.20862141, -1.4882805, -1.2539062, -0.404971, -1.4882805, 0.99609375, 0.39269918, 1.464843, 1.0195312, -0.40497103, 1.371093, -1.1601562, 0.45405844, -0.94921803, -3.0429685, -0.5645049, -1.0664055, 2.9257808, 0.5645049, 1.042968, 2.9257808, -0.5645049, 0.90234303, -2.9960935, 0.5645049, -0.8398433, -0.5351558, 0.4417866, -0.7695308, 0.23046827, -0.47860214, 0.8164058, 0.25390577, 0.52768946, 0.6757808, -0.48828077, -0.38042733, -1.324218, -0.46484327, 0.5154177, -1.464843, 0.18359327, -0.5154177, 1.464843, 0.18359327, 0.5154177, 1.277343, -0.48828077, -0.5154177, 2.1601567, 0.6289065, -0.908116, 1.9492192, -0.9101565, 0.94493145, -2.0429692, -0.886719, -0.94493145, -2.2070317, 0.652344, 0.89584416, -2.6054685, 1.160157, 0.42951474, -2.441406, -1.3710945, -0.42951474, 2.3710935, -1.4179695, 0.490874, 2.582031, 1.1835945, -0.42951474, 2.3945317, -2.6210935, 1.0921937, 2.5820317, 2.6445308, -1.0921937, -2.6054692, 2.5976558, 1.0921937, -2.3710942, -2.6679685, -1.0431062, -0.41796827, -3.7382812, -0.11044659, -0.48828077, 3.7617188, 0.11044659, 0.41796827, 3.7382812, -0.11044659, 0.41796827, -3.7617188, 0.11044659, -2.7617183, 1.8398445, -0.012271845, -2.5507808, -2.0742195, 0.012271845, 2.5273433, -2.0273445, -0.012271845, 2.7617183, 1.910157, 0.012271845, -1.7773433, 1.6445317, 0.0, -1.5898433, -1.9257817, 0.036815543, 1.5429683, -1.8320317, 0.0, 1.8242183, 1.6679692, -0.0, -1.230468, -3.5742188, -0.2822525, -1.3945305, 3.5976562, 0.2822525, 1.324218, 3.5507812, -0.2822525, 1.2539055, -3.5742188, 0.2822525, -2.113281, 3.222657, 0.699495, -1.9023435, -3.222657, -0.6626795, 1.925781, -3.222657, 0.6626795, 2.0429685, 3.222657, -0.6504077, -0.019530773, -0.31640625, 0.0, -0.050781727, -0.003906727, 0.0 }, { 0.37166548, 3.2632298, 1.3499032, 0.37166548, -3.2632306, -1.3499032, -0.44599915, -3.2632306, 1.3499032, -0.44599915, 3.2632298, -1.3499032, 1.300832, 2.222565, -1.1290094, 1.2562323, -2.222565, 1.1290094, -1.7096651, -2.088765, -1.1290094, -1.3751643, 2.423265, 1.264, 1.8062983, 2.4455652, 0.20862141, 1.8062983, -2.4455645, -0.20862141, -0.36423182, 0.31963205, 0.061359234, -2.2820292, 2.6685648, -0.2822525, 0.8548329, 2.8618298, -0.68722314, 0.8548329, -2.8618305, 0.68722314, -1.308265, -2.88413, -0.92038774, -0.9737649, 2.9064302, 0.68722314, 1.4197648, -1.2636652, 1.5585252, -2.3489313, -2.6165307, -1.1167375, 2.2522974, -2.6165307, 1.1167375, 2.2299986, 2.61653, -1.1167375, 0.37166548, 3.768696, -0.11044659, 0.37166548, -3.7686968, 0.11044659, -0.44599915, -3.7686968, -0.11044659, -0.44599915, 3.768696, 0.11044659, 2.4455624, -2.073899, -0.18407771, 2.467864, 1.8954985, 0.18407771, -2.5867968, -1.9846988, 0.18407771, 1.9549642, -1.5758665, -0.1349903, 1.9549642, 1.5758657, 0.1349903, -1.7839973, -1.508965, -0.08590292, 1.1670313, 3.567996, -0.3804273, 1.1670313, -3.5679967, 0.3804273, -1.2413642, -3.5679967, -0.3804273, -1.2413642, 3.567996, 0.3804273, 1.8062983, -3.2111971, 0.6749513, 1.7616985, 3.2111979, -0.6749513, -1.8806305, 3.2111979, 0.6749513, -1.8806305, -3.2111971, -0.6749513, 2.5198975, 1.5163987, 0.12271846, 2.5421963, -1.4717989, -0.12271846, -2.6388295, -1.3379989, -0.049087383, 1.5238309, 1.5386982, 0.26998067, 1.5238309, -1.5386989, -0.17180586, -0.83996487, 0.66899943, 0.18407771, 2.6239643, 0.6764324, 0.098174766, 2.6239643, -0.6764324, -0.098174766, -2.4752963, -0.5203328, -0.33133993, 1.6799319, 0.6764324, 0.098174766, 1.6799319, -0.6764324, -0.098174766, -1.642765, -0.6764324, -0.39269918, 2.6388302, -0.037166834, 0.0, 1.6873641, -0.059467077, 0.0, -1.4717982, 0.49803257, 0.3804273, -2.1333654, 0.07433295, -0.8099414, -1.1372995, -0.029733181, 0.6504077, 0.34936523, 0.14123225, -0.47860217, 1.0852647, -0.36423326, 0.8099414, -0.22299886, 0.6466992, -0.28225255, 0.43856764, 0.3567996, -0.51541764, 0.96633196, -0.014867306, -0.699495 }}; float[] xOffsets = {0, -0.25, 0, 0, 0, 0, 0, 0, 0, 0};