summaryrefslogtreecommitdiffstats
path: root/kscreensaver/kdesavers
diff options
context:
space:
mode:
Diffstat (limited to 'kscreensaver/kdesavers')
-rw-r--r--kscreensaver/kdesavers/Euphoria.cpp1084
-rw-r--r--kscreensaver/kdesavers/Euphoria.h155
-rw-r--r--kscreensaver/kdesavers/EuphoriaTexture.h4138
-rw-r--r--kscreensaver/kdesavers/Flux.cpp967
-rw-r--r--kscreensaver/kdesavers/Flux.h147
-rw-r--r--kscreensaver/kdesavers/KBanner.desktop243
-rw-r--r--kscreensaver/kdesavers/KBlob.desktop227
-rw-r--r--kscreensaver/kdesavers/KClock.desktop252
-rw-r--r--kscreensaver/kdesavers/KEuphoria.desktop233
-rw-r--r--kscreensaver/kdesavers/KFiresaver.desktop233
-rw-r--r--kscreensaver/kdesavers/KFlux.desktop224
-rw-r--r--kscreensaver/kdesavers/KFountain.desktop249
-rw-r--r--kscreensaver/kdesavers/KGravity.desktop253
-rw-r--r--kscreensaver/kdesavers/KLines-saver.desktop255
-rw-r--r--kscreensaver/kdesavers/KLorenz.desktop244
-rw-r--r--kscreensaver/kdesavers/KPendulum.desktop221
-rw-r--r--kscreensaver/kdesavers/KPolygon.desktop251
-rw-r--r--kscreensaver/kdesavers/KRotation.desktop221
-rw-r--r--kscreensaver/kdesavers/KScience.desktop254
-rw-r--r--kscreensaver/kdesavers/KSlideshow.desktop251
-rw-r--r--kscreensaver/kdesavers/KSolarWinds.desktop243
-rw-r--r--kscreensaver/kdesavers/KVm.desktop253
-rw-r--r--kscreensaver/kdesavers/KWave.desktop251
-rw-r--r--kscreensaver/kdesavers/Makefile.am102
-rw-r--r--kscreensaver/kdesavers/README3
-rw-r--r--kscreensaver/kdesavers/SolarWinds.cpp778
-rw-r--r--kscreensaver/kdesavers/SolarWinds.h138
-rw-r--r--kscreensaver/kdesavers/banner.cpp509
-rw-r--r--kscreensaver/kdesavers/banner.h112
-rw-r--r--kscreensaver/kdesavers/blob.cpp527
-rw-r--r--kscreensaver/kdesavers/blob.h117
-rw-r--r--kscreensaver/kdesavers/data/Makefile.am11
-rw-r--r--kscreensaver/kdesavers/data/kfs_debris.oggbin0 -> 28158 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_explode.oggbin0 -> 9864 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_kde.pngbin0 -> 9899 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_letters.desc84
-rw-r--r--kscreensaver/kdesavers/data/kfs_letters1.pngbin0 -> 28082 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_letters2.pngbin0 -> 26885 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_particle.pngbin0 -> 890 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_particle_diastar.pngbin0 -> 1100 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_particle_flare.pngbin0 -> 6041 bytes
-rw-r--r--kscreensaver/kdesavers/data/kfs_tux.pngbin0 -> 4382 bytes
-rw-r--r--kscreensaver/kdesavers/firesaver.ChangeLog106
-rw-r--r--kscreensaver/kdesavers/firesaver.cpp1151
-rw-r--r--kscreensaver/kdesavers/firesaver.h170
-rw-r--r--kscreensaver/kdesavers/firesaverparticle.cpp273
-rw-r--r--kscreensaver/kdesavers/firesaverparticle.h105
-rw-r--r--kscreensaver/kdesavers/firesaversetup.ui1855
-rw-r--r--kscreensaver/kdesavers/firesaversetup.ui.h400
-rw-r--r--kscreensaver/kdesavers/firesaverwriter.cpp247
-rw-r--r--kscreensaver/kdesavers/firesaverwriter.h113
-rw-r--r--kscreensaver/kdesavers/fountain.cpp461
-rw-r--r--kscreensaver/kdesavers/fountain.h140
-rw-r--r--kscreensaver/kdesavers/fountaincfg.ui192
-rw-r--r--kscreensaver/kdesavers/gravity.cpp419
-rw-r--r--kscreensaver/kdesavers/gravity.h141
-rw-r--r--kscreensaver/kdesavers/gravitycfg.ui192
-rw-r--r--kscreensaver/kdesavers/image.pngbin0 -> 53876 bytes
-rw-r--r--kscreensaver/kdesavers/kclock.cpp588
-rw-r--r--kscreensaver/kdesavers/kclock.h130
-rw-r--r--kscreensaver/kdesavers/kscience.pngbin0 -> 10664 bytes
-rw-r--r--kscreensaver/kdesavers/kvm.cpp384
-rw-r--r--kscreensaver/kdesavers/kvm.h99
-rw-r--r--kscreensaver/kdesavers/lines.cpp401
-rw-r--r--kscreensaver/kdesavers/lines.h96
-rw-r--r--kscreensaver/kdesavers/lorenz.cpp569
-rw-r--r--kscreensaver/kdesavers/lorenz.h86
-rw-r--r--kscreensaver/kdesavers/particle.pngbin0 -> 1957 bytes
-rw-r--r--kscreensaver/kdesavers/pendulum.cpp881
-rw-r--r--kscreensaver/kdesavers/pendulum.h388
-rw-r--r--kscreensaver/kdesavers/pendulumcfg.ui566
-rw-r--r--kscreensaver/kdesavers/polygon.cpp366
-rw-r--r--kscreensaver/kdesavers/polygon.h79
-rw-r--r--kscreensaver/kdesavers/rkodesolver.cpp252
-rw-r--r--kscreensaver/kdesavers/rkodesolver.h187
-rw-r--r--kscreensaver/kdesavers/rotation.cpp825
-rw-r--r--kscreensaver/kdesavers/rotation.h325
-rw-r--r--kscreensaver/kdesavers/rotationcfg.ui488
-rw-r--r--kscreensaver/kdesavers/science.cpp1151
-rw-r--r--kscreensaver/kdesavers/science.h148
-rw-r--r--kscreensaver/kdesavers/slideshow.cpp1022
-rw-r--r--kscreensaver/kdesavers/slideshow.h150
-rw-r--r--kscreensaver/kdesavers/slideshowcfg.ui176
-rw-r--r--kscreensaver/kdesavers/sspreviewarea.cpp21
-rw-r--r--kscreensaver/kdesavers/sspreviewarea.h57
-rw-r--r--kscreensaver/kdesavers/vec3.cpp105
-rw-r--r--kscreensaver/kdesavers/vec3.h214
-rw-r--r--kscreensaver/kdesavers/vm.c264
-rw-r--r--kscreensaver/kdesavers/vm.h52
-rw-r--r--kscreensaver/kdesavers/vm.xbm191
-rw-r--r--kscreensaver/kdesavers/vm.xpm493
-rw-r--r--kscreensaver/kdesavers/vm_random.c379
-rw-r--r--kscreensaver/kdesavers/vm_random.h31
-rw-r--r--kscreensaver/kdesavers/wave.cpp324
-rw-r--r--kscreensaver/kdesavers/wave.h97
-rw-r--r--kscreensaver/kdesavers/wavecfg.ui191
96 files changed, 30971 insertions, 0 deletions
diff --git a/kscreensaver/kdesavers/Euphoria.cpp b/kscreensaver/kdesavers/Euphoria.cpp
new file mode 100644
index 00000000..740e957c
--- /dev/null
+++ b/kscreensaver/kdesavers/Euphoria.cpp
@@ -0,0 +1,1084 @@
+//============================================================================
+//
+// Terence Welsh Screensaver - Euphoria
+// http://www.reallyslick.com/
+//
+// Ported to KDE by Karl Robillard
+//
+/*
+ * Copyright (C) 2002 Terence M. Welsh
+ *
+ * Euphoria is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Euphoria is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+//============================================================================
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <qtimer.h>
+#include "Euphoria.h"
+#include "Euphoria.moc"
+#include "EuphoriaTexture.h"
+
+
+#define NUMCONSTS 9
+#define PIx2 6.28318530718f
+
+
+//----------------------------------------------------------------------------
+
+
+#include <sys/time.h>
+#include <unistd.h>
+
+
+// Returns the system time, in seconds.
+double timeGetTime()
+{
+ struct timeval tp;
+ gettimeofday( &tp, 0 );
+ return (double)tp.tv_sec + (double)tp.tv_usec / 1000000;
+}
+
+
+//----------------------------------------------------------------------------
+
+
+class rsVec
+{
+public:
+
+ float v[3];
+
+ rsVec() {}
+ rsVec(float xx, float yy, float zz);
+
+ void set(float xx, float yy, float zz);
+ float normalize();
+ float dot(rsVec);
+ void cross(rsVec, rsVec);
+
+ float & operator [] (int i) {return v[i];}
+ const float & operator [] (int i) const {return v[i];}
+ rsVec & operator = (const rsVec &vec)
+ {v[0]=vec[0];v[1]=vec[1];v[2]=vec[2];return *this;};
+ rsVec operator + (const rsVec &vec)
+ {return(rsVec(v[0]+vec[0], v[1]+vec[1], v[2]+vec[2]));};
+ rsVec operator - (const rsVec &vec)
+ {return(rsVec(v[0]-vec[0], v[1]-vec[1], v[2]-vec[2]));};
+ rsVec operator * (const float &mul)
+ {return(rsVec(v[0]*mul, v[1]*mul, v[2]*mul));};
+ rsVec operator / (const float &div)
+ {float rec = 1.0f/div; return(rsVec(v[0]*rec, v[1]*rec, v[2]*rec));};
+ rsVec & operator += (const rsVec &vec)
+ {v[0]+=vec[0];v[1]+=vec[1];v[2]+=vec[2];return *this;};
+ rsVec & operator -= (const rsVec &vec)
+ {v[0]-=vec[0];v[1]-=vec[1];v[2]-=vec[2];return *this;};
+ rsVec & operator *= (const rsVec &vec)
+ {v[0]*=vec[0];v[1]*=vec[1];v[2]*=vec[2];return *this;};
+ rsVec & operator *= (const float &mul)
+ {v[0]*=mul;v[1]*=mul;v[2]*=mul;return *this;};
+};
+
+
+rsVec::rsVec(float xx, float yy, float zz){
+ v[0] = xx;
+ v[1] = yy;
+ v[2] = zz;
+}
+
+
+void rsVec::set(float xx, float yy, float zz){
+ v[0] = xx;
+ v[1] = yy;
+ v[2] = zz;
+}
+
+
+float rsVec::normalize(){
+ float length = float(sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
+ if(length == 0.0f){
+ v[1] = 1.0f;
+ return(0.0f);
+ }
+ float reciprocal = 1.0f / length;
+ v[0] *= reciprocal;
+ v[1] *= reciprocal;
+ v[2] *= reciprocal;
+ // Really freakin' stupid compiler bug fix for VC++ 5.0
+ /*v[0] /= length;
+ v[1] /= length;
+ v[2] /= length;*/
+ return(length);
+}
+
+
+float rsVec::dot(rsVec vec1){
+ return(v[0] * vec1[0] + v[1] * vec1[1] + v[2] * vec1[2]);
+}
+
+
+void rsVec::cross(rsVec vec1, rsVec vec2){
+ v[0] = vec1[1] * vec2[2] - vec2[1] * vec1[2];
+ v[1] = vec1[2] * vec2[0] - vec2[2] * vec1[0];
+ v[2] = vec1[0] * vec2[1] - vec2[0] * vec1[1];
+}
+
+
+//----------------------------------------------------------------------------
+
+
+void hsl2rgb(float h, float s, float l, float &r, float &g, float &b)
+{
+ // hue influence
+ if(h < 0.166667){ // full red, some green
+ r = 1.0;
+ g = h * 6.0f;
+ b = 0.0;
+ }
+ else {
+ if(h < 0.5){ // full green
+ g = 1.0;
+ if(h < 0.333333){ // some red
+ r = 1.0f - ((h - 0.166667f) * 6.0f);
+ b = 0.0;
+ }
+ else{ // some blue
+ b = (h - 0.333333f) * 6.0f;
+ r = 0.0;
+ }
+ }
+ else{
+ if(h < 0.833333){ // full blue
+ b = 1.0;
+ if(h < 0.666667){ // some green
+ g = 1.0f - ((h - 0.5f) * 6.0f);
+ r = 0.0;
+ }
+ else{ // some red
+ r = (h - 0.666667f) * 6.0f;
+ g = 0.0;
+ }
+ }
+ else{ // full red, some blue
+ r = 1.0;
+ b = 1.0f - ((h - 0.833333f) * 6.0f);
+ g = 0.0;
+ }
+ }
+ }
+
+ // saturation influence
+ r = 1.0f - (s * (1.0f - r));
+ g = 1.0f - (s * (1.0f - g));
+ b = 1.0f - (s * (1.0f - b));
+
+ // luminosity influence
+ r *= l;
+ g *= l;
+ b *= l;
+}
+
+
+// Useful random number macros
+// Don't forget to initialize with srand()
+inline int myRandi(int x){
+ return((rand() * x) / RAND_MAX);
+}
+inline float myRandf(float x){
+ return(float(rand() * x) / float(RAND_MAX));
+}
+
+
+//----------------------------------------------------------------------------
+
+
+// Context pointer to allow many instances.
+static EuphoriaWidget* _ec = 0;
+
+
+class wisp
+{
+public:
+
+ wisp();
+ ~wisp();
+ void update();
+ void draw();
+ void drawAsBackground();
+
+
+ int density;
+ float*** vertices;
+ float c[NUMCONSTS]; // constants
+ float cr[NUMCONSTS]; // constants' radial position
+ float cv[NUMCONSTS]; // constants' change velocities
+ float hsl[3];
+ float rgb[3];
+ float hueSpeed;
+ float saturationSpeed;
+};
+
+
+wisp::wisp()
+{
+ int i, j;
+ float recHalfDens = 1.0f / (float(_ec->dDensity) * 0.5f);
+
+ density = _ec->dDensity;
+ vertices = new float**[density+1];
+ for(i=0; i<=density; i++)
+ {
+ vertices[i] = new float*[density+1];
+ for(j=0; j<=density; j++)
+ {
+ vertices[i][j] = new float[7];
+ vertices[i][j][3] = float(i) * recHalfDens - 1.0f; // x position on grid
+ vertices[i][j][4] = float(j) * recHalfDens - 1.0f; // y position on grid
+ // distance squared from the center
+ vertices[i][j][5] = vertices[i][j][3] * vertices[i][j][3]
+ + vertices[i][j][4] * vertices[i][j][4];
+ vertices[i][j][6] = 0.0f; // intensity
+ }
+ }
+
+ // initialize constants
+ for(i=0; i<NUMCONSTS; i++)
+ {
+ c[i] = myRandf(2.0f) - 1.0f;
+ cr[i] = myRandf(PIx2);
+ cv[i] = myRandf(_ec->dSpeed * 0.03f) + (_ec->dSpeed * 0.001f);
+ }
+
+ // pick color
+ hsl[0] = myRandf(1.0f);
+ hsl[1] = 0.1f + myRandf(0.9f);
+ hsl[2] = 1.0f;
+ hueSpeed = myRandf(0.1f) - 0.05f;
+ saturationSpeed = myRandf(0.04f) + 0.001f;
+}
+
+
+wisp::~wisp()
+{
+ int i, j;
+
+ for(i=0; i<=density; i++)
+ {
+ for(j=0; j<=density; j++)
+ {
+ delete[] vertices[i][j];
+ }
+ delete[] vertices[i];
+ }
+ delete[] vertices;
+}
+
+
+void wisp::update()
+{
+ int i, j;
+ rsVec up, right, crossvec;
+ // visibility constants
+ static float viscon1 = float(_ec->dVisibility) * 0.01f;
+ static float viscon2 = 1.0f / viscon1;
+
+ // update constants
+ for(i=0; i<NUMCONSTS; i++){
+ cr[i] += cv[i] * _ec->elapsedTime;
+ if(cr[i] > PIx2)
+ cr[i] -= PIx2;
+ c[i] = cos(cr[i]);
+ }
+
+ // update vertex positions
+ for(i=0; i<=density; i++){
+ for(j=0; j<=density; j++){
+ vertices[i][j][0] = vertices[i][j][3] * vertices[i][j][3] * vertices[i][j][4] * c[0]
+ + vertices[i][j][5] * c[1] + 0.5f * c[2];
+ vertices[i][j][1] = vertices[i][j][4] * vertices[i][j][4] * vertices[i][j][5] * c[3]
+ + vertices[i][j][3] * c[4] + 0.5f * c[5];
+ vertices[i][j][2] = vertices[i][j][5] * vertices[i][j][5] * vertices[i][j][3] * c[6]
+ + vertices[i][j][4] * c[7] + c[8];
+ }
+ }
+
+ // update vertex normals for most of mesh
+ for(i=1; i<density; i++){
+ for(j=1; j<density; j++){
+ up.set(vertices[i][j+1][0] - vertices[i][j-1][0],
+ vertices[i][j+1][1] - vertices[i][j-1][1],
+ vertices[i][j+1][2] - vertices[i][j-1][2]);
+ right.set(vertices[i+1][j][0] - vertices[i-1][j][0],
+ vertices[i+1][j][1] - vertices[i-1][j][1],
+ vertices[i+1][j][2] - vertices[i-1][j][2]);
+ up.normalize();
+ right.normalize();
+ crossvec.cross(right, up);
+ // Use depth component of normal to compute intensity
+ // This way only edges of wisp are bright
+ if(crossvec[2] < 0.0f)
+ crossvec[2] *= -1.0f;
+ vertices[i][j][6] = viscon2 * (viscon1 - crossvec[2]);
+ if(vertices[i][j][6] > 1.0f)
+ vertices[i][j][6] = 1.0f;
+ if(vertices[i][j][6] < 0.0f)
+ vertices[i][j][6] = 0.0f;
+ }
+ }
+
+ // update color
+ hsl[0] += hueSpeed * _ec->elapsedTime;
+ if(hsl[0] < 0.0f)
+ hsl[0] += 1.0f;
+ if(hsl[0] > 1.0f)
+ hsl[0] -= 1.0f;
+ hsl[1] += saturationSpeed * _ec->elapsedTime;
+ if(hsl[1] <= 0.1f){
+ hsl[1] = 0.1f;
+ saturationSpeed = -saturationSpeed;
+ }
+ if(hsl[1] >= 1.0f){
+ hsl[1] = 1.0f;
+ saturationSpeed = -saturationSpeed;
+ }
+ hsl2rgb(hsl[0], hsl[1], hsl[2], rgb[0], rgb[1], rgb[2]);
+}
+
+
+void wisp::draw()
+{
+ int i, j;
+
+ glPushMatrix();
+
+ if(_ec->dWireframe)
+ {
+ for(i=1; i<density; i++){
+ glBegin(GL_LINE_STRIP);
+ for(j=0; j<=density; j++){
+ glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f);
+ glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]);
+ glVertex3fv(vertices[i][j]);
+ }
+ glEnd();
+ }
+ for(j=1; j<density; j++){
+ glBegin(GL_LINE_STRIP);
+ for(i=0; i<=density; i++){
+ glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f);
+ glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]);
+ glVertex3fv(vertices[i][j]);
+ }
+ glEnd();
+ }
+ }
+ else
+ {
+ for(i=0; i<density; i++){
+ glBegin(GL_TRIANGLE_STRIP);
+ for(j=0; j<=density; j++){
+ glColor3f(rgb[0] + vertices[i+1][j][6] - 1.0f, rgb[1] + vertices[i+1][j][6] - 1.0f, rgb[2] + vertices[i+1][j][6] - 1.0f);
+ glTexCoord2d(vertices[i+1][j][3] - vertices[i+1][j][0], vertices[i+1][j][4] - vertices[i+1][j][1]);
+ glVertex3fv(vertices[i+1][j]);
+ glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f);
+ glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]);
+ glVertex3fv(vertices[i][j]);
+ }
+ glEnd();
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+void wisp::drawAsBackground()
+{
+ int i, j;
+
+ glPushMatrix();
+ glTranslatef(c[0] * 0.2f, c[1] * 0.2f, 1.6f);
+
+ if(_ec->dWireframe)
+ {
+ for(i=1; i<density; i++){
+ glBegin(GL_LINE_STRIP);
+ for(j=0; j<=density; j++){
+ glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f);
+ glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]);
+ glVertex3f(vertices[i][j][3], vertices[i][j][4], vertices[i][j][6]);
+ }
+ glEnd();
+ }
+ for(j=1; j<density; j++){
+ glBegin(GL_LINE_STRIP);
+ for(i=0; i<=density; i++){
+ glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f);
+ glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]);
+ glVertex3f(vertices[i][j][3], vertices[i][j][4], vertices[i][j][6]);
+ }
+ glEnd();
+ }
+ }
+ else
+ {
+ for(i=0; i<density; i++){
+ glBegin(GL_TRIANGLE_STRIP);
+ for(j=0; j<=density; j++){
+ glColor3f(rgb[0] + vertices[i+1][j][6] - 1.0f, rgb[1] + vertices[i+1][j][6] - 1.0f, rgb[2] + vertices[i+1][j][6] - 1.0f);
+ glTexCoord2d(vertices[i+1][j][3] - vertices[i+1][j][0], vertices[i+1][j][4] - vertices[i+1][j][1]);
+ glVertex3f(vertices[i+1][j][3], vertices[i+1][j][4], vertices[i+1][j][6]);
+ glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f);
+ glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]);
+ glVertex3f(vertices[i][j][3], vertices[i][j][4], vertices[i][j][6]);
+ }
+ glEnd();
+ }
+ }
+
+ glPopMatrix();
+}
+
+
+//----------------------------------------------------------------------------
+
+
+EuphoriaWidget::EuphoriaWidget( QWidget* parent, const char* name )
+ : QGLWidget(parent, name), texName(0), _wisps(0), _backwisps(0),
+ feedbackmap(0), feedbacktex(0)
+{
+ setDefaults( Regular );
+
+ _frameTime = 1000 / 60;
+ _timer = new QTimer( this );
+ connect( _timer, SIGNAL(timeout()), this, SLOT(nextFrame()) );
+}
+
+
+EuphoriaWidget::~EuphoriaWidget()
+{
+ // Free memory
+ if ( texName )
+ glDeleteTextures( 1, &texName );
+ if ( feedbacktex )
+ glDeleteTextures( 1, &feedbacktex );
+ delete[] _wisps;
+ delete[] _backwisps;
+}
+
+
+void EuphoriaWidget::paintGL()
+{
+ int i;
+ static double lastTime = timeGetTime();
+
+ // update time
+ elapsedTime = timeGetTime() - lastTime;
+ lastTime += elapsedTime;
+
+ _ec = this;
+
+ // Update wisps
+ for(i=0; i<dWisps; i++)
+ _wisps[i].update();
+ for(i=0; i<dBackground; i++)
+ _backwisps[i].update();
+
+
+ if(dFeedback)
+ {
+ float feedbackIntensity = float(dFeedback) / 101.0f;
+
+ // update feedback variables
+ for(i=0; i<4; i++)
+ {
+ fr[i] += elapsedTime * fv[i];
+ if(fr[i] > PIx2)
+ fr[i] -= PIx2;
+ }
+ f[0] = 30.0f * cos(fr[0]);
+ f[1] = 0.2f * cos(fr[1]);
+ f[2] = 0.2f * cos(fr[2]);
+ f[3] = 0.8f * cos(fr[3]);
+ for(i=0; i<3; i++)
+ {
+ lr[i] += elapsedTime * lv[i];
+ if(lr[i] > PIx2)
+ lr[i] -= PIx2;
+ l[i] = cos(lr[i]);
+ l[i] = l[i] * l[i];
+ }
+
+ // Create drawing area for feedback texture
+ glViewport(0, 0, feedbacktexsize, feedbacktexsize);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0, aspectRatio, 0.01f, 20.0f);
+ glMatrixMode(GL_MODELVIEW);
+
+ // Draw
+ glClear(GL_COLOR_BUFFER_BIT);
+ glColor3f(feedbackIntensity, feedbackIntensity, feedbackIntensity);
+ glBindTexture(GL_TEXTURE_2D, feedbacktex);
+ glPushMatrix();
+ glTranslatef(f[1] * l[1], f[2] * l[1], f[3] * l[2]);
+ glRotatef(f[0] * l[0], 0, 0, 1);
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2f(-0.5f, -0.5f);
+ glVertex3f(-aspectRatio*2.0f, -2.0f, 1.25f);
+ glTexCoord2f(1.5f, -0.5f);
+ glVertex3f(aspectRatio*2.0f, -2.0f, 1.25f);
+ glTexCoord2f(-0.5f, 1.5f);
+ glVertex3f(-aspectRatio*2.0f, 2.0f, 1.25f);
+ glTexCoord2f(1.5f, 1.5f);
+ glVertex3f(aspectRatio*2.0f, 2.0f, 1.25f);
+ glEnd();
+ glPopMatrix();
+ glBindTexture(GL_TEXTURE_2D, texName);
+ for(i=0; i<dBackground; i++)
+ _backwisps[i].drawAsBackground();
+ for(i=0; i<dWisps; i++)
+ _wisps[i].draw();
+
+ // readback feedback texture
+ glReadBuffer(GL_BACK);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, feedbacktexsize);
+ glBindTexture(GL_TEXTURE_2D, feedbacktex);
+ glReadPixels(0, 0, feedbacktexsize, feedbacktexsize, GL_RGB, GL_UNSIGNED_BYTE, feedbackmap);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, feedbacktexsize, feedbacktexsize, GL_RGB, GL_UNSIGNED_BYTE, feedbackmap);
+
+ // create regular drawing area
+ glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(20.0, aspectRatio, 0.01f, 20.0f);
+ glMatrixMode(GL_MODELVIEW);
+
+ // Draw again
+ glClear(GL_COLOR_BUFFER_BIT);
+ glColor3f(feedbackIntensity, feedbackIntensity, feedbackIntensity);
+ glPushMatrix();
+ glTranslatef(f[1] * l[1], f[2] * l[1], f[3] * l[2]);
+ glRotatef(f[0] * l[0], 0, 0, 1);
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2f(-0.5f, -0.5f);
+ glVertex3f(-aspectRatio*2.0f, -2.0f, 1.25f);
+ glTexCoord2f(1.5f, -0.5f);
+ glVertex3f(aspectRatio*2.0f, -2.0f, 1.25f);
+ glTexCoord2f(-0.5f, 1.5f);
+ glVertex3f(-aspectRatio*2.0f, 2.0f, 1.25f);
+ glTexCoord2f(1.5f, 1.5f);
+ glVertex3f(aspectRatio*2.0f, 2.0f, 1.25f);
+ glEnd();
+ glPopMatrix();
+
+ glBindTexture(GL_TEXTURE_2D, texName);
+ }
+ else
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ //
+ for(i=0; i<dBackground; i++)
+ _backwisps[i].drawAsBackground();
+ for(i=0; i<dWisps; i++)
+ _wisps[i].draw();
+
+ glFlush();
+}
+
+
+void EuphoriaWidget::resizeGL( int w, int h )
+{
+ glViewport(0, 0, w, h );
+
+ viewport[0] = 0;
+ viewport[1] = 0;
+ viewport[2] = w;
+ viewport[3] = h;
+
+ aspectRatio = (float) w / (float) h;
+
+ // setup regular drawing area just in case feedback isn't used
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(20.0, aspectRatio, 0.01, 20);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -5.0);
+}
+
+
+// Window initialization
+void EuphoriaWidget::initializeGL()
+{
+ // Need to call this to setup viewport[] parameters used in
+ // the next updateParameters() call
+ resizeGL( width(), height() );
+
+ updateParameters();
+
+ _timer->start( _frameTime, true );
+}
+
+
+#ifdef UNIT_TEST
+void EuphoriaWidget::keyPressEvent( QKeyEvent* e )
+{
+ if( e->key() == Qt::Key_0 ) { setDefaults( 0 ); updateParameters(); }
+ if( e->key() == Qt::Key_1 ) { setDefaults( 1 ); updateParameters(); }
+ if( e->key() == Qt::Key_2 ) { setDefaults( 2 ); updateParameters(); }
+ if( e->key() == Qt::Key_3 ) { setDefaults( 3 ); updateParameters(); }
+ if( e->key() == Qt::Key_4 ) { setDefaults( 4 ); updateParameters(); }
+ if( e->key() == Qt::Key_5 ) { setDefaults( 5 ); updateParameters(); }
+ if( e->key() == Qt::Key_6 ) { setDefaults( 6 ); updateParameters(); }
+ if( e->key() == Qt::Key_7 ) { setDefaults( 7 ); updateParameters(); }
+ if( e->key() == Qt::Key_8 ) { setDefaults( 8 ); updateParameters(); }
+}
+#endif
+
+
+void EuphoriaWidget::nextFrame()
+{
+ updateGL();
+ _timer->start( _frameTime, true );
+}
+
+
+void EuphoriaWidget::updateParameters()
+{
+ srand((unsigned)time(NULL));
+ rand(); rand(); rand(); rand(); rand();
+
+ elapsedTime = 0.0f;
+
+ fr[0] = 0.0f;
+ fr[1] = 0.0f;
+ fr[2] = 0.0f;
+ fr[3] = 0.0f;
+
+ lr[0] = 0.0f;
+ lr[1] = 0.0f;
+ lr[2] = 0.0f;
+
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE);
+ glLineWidth(2.0f);
+
+ // Commented out because smooth lines and textures don't mix on my TNT.
+ // It's like it rendering in software mode
+ glEnable(GL_LINE_SMOOTH);
+ //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+
+ if(dTexture)
+ {
+ int whichtex = dTexture;
+ if(whichtex == 4) // random texture
+ whichtex = myRandi(3) + 1;
+ glEnable(GL_TEXTURE_2D);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ // Initialize texture
+ glGenTextures(1, &texName);
+ glBindTexture(GL_TEXTURE_2D, texName);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ switch(whichtex){
+ case 1:
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEXSIZE, TEXSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, plasmamap);
+ break;
+ case 2:
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEXSIZE, TEXSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, stringymap);
+ break;
+ case 3:
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEXSIZE, TEXSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, linesmap);
+ }
+ } else if ( texName ) {
+ glDeleteTextures( 1, &texName );
+ texName = 0;
+ }
+
+ if(dFeedback)
+ {
+ feedbacktexsize = int(pow(2.0, dFeedbacksize));
+ while(feedbacktexsize > viewport[2] || feedbacktexsize > viewport[3]){
+ dFeedbacksize -= 1;
+ feedbacktexsize = int(pow(2.0, dFeedbacksize));
+ }
+
+ // feedback texture setup
+ glEnable(GL_TEXTURE_2D);
+ delete [] feedbackmap;
+ feedbackmap = new unsigned char[feedbacktexsize*feedbacktexsize*3];
+ glGenTextures(1, &feedbacktex);
+ glBindTexture(GL_TEXTURE_2D, feedbacktex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, feedbacktexsize, feedbacktexsize, 0, GL_RGB, GL_UNSIGNED_BYTE, feedbackmap);
+
+ // feedback velocity variable setup
+ fv[0] = float(dFeedbackspeed) * (myRandf(0.025f) + 0.025f);
+ fv[1] = float(dFeedbackspeed) * (myRandf(0.05f) + 0.05f);
+ fv[2] = float(dFeedbackspeed) * (myRandf(0.05f) + 0.05f);
+ fv[3] = float(dFeedbackspeed) * (myRandf(0.1f) + 0.1f);
+ lv[0] = float(dFeedbackspeed) * (myRandf(0.0025f) + 0.0025f);
+ lv[1] = float(dFeedbackspeed) * (myRandf(0.0025f) + 0.0025f);
+ lv[2] = float(dFeedbackspeed) * (myRandf(0.0025f) + 0.0025f);
+ } else if ( feedbacktex ) {
+ glDeleteTextures( 1, &feedbacktex );
+ feedbacktex = 0;
+ }
+
+ // Initialize wisps
+ _ec = this;
+ delete[] _wisps;
+ delete[] _backwisps;
+ _wisps = new wisp[dWisps];
+ _backwisps = new wisp[dBackground];
+}
+
+
+/**
+ May be called at any time - makes no OpenGL calls.
+*/
+void EuphoriaWidget::setDefaults(int which)
+{
+ switch(which)
+ {
+ case Grid:
+ dWisps = 4;
+ dBackground = 1;
+ dDensity = 25;
+ dVisibility = 70;
+ dSpeed = 15;
+ dFeedback = 0;
+ dFeedbackspeed = 1;
+ dFeedbacksize = 8;
+ dWireframe = 1;
+ dTexture = 0;
+ break;
+
+ case Cubism:
+ dWisps = 15;
+ dBackground = 0;
+ dDensity = 4;
+ dVisibility = 15;
+ dSpeed = 10;
+ dFeedback = 0;
+ dFeedbackspeed = 1;
+ dFeedbacksize = 8;
+ dWireframe = 0;
+ dTexture = 0;
+ break;
+
+ case BadMath:
+ dWisps = 2;
+ dBackground = 2;
+ dDensity = 20;
+ dVisibility = 40;
+ dSpeed = 30;
+ dFeedback = 40;
+ dFeedbackspeed = 5;
+ dFeedbacksize = 8;
+ dWireframe = 1;
+ dTexture = 2;
+ break;
+
+ case MTheory:
+ dWisps = 3;
+ dBackground = 0;
+ dDensity = 25;
+ dVisibility = 15;
+ dSpeed = 20;
+ dFeedback = 40;
+ dFeedbackspeed = 20;
+ dFeedbacksize = 8;
+ dWireframe = 0;
+ dTexture = 0;
+ break;
+
+ case UHFTEM:
+ dWisps = 0;
+ dBackground = 3;
+ dDensity = 35;
+ dVisibility = 5;
+ dSpeed = 50;
+ dFeedback = 0;
+ dFeedbackspeed = 1;
+ dFeedbacksize = 8;
+ dWireframe = 0;
+ dTexture = 0;
+ break;
+
+ case Nowhere:
+ dWisps = 0;
+ dBackground = 3;
+ dDensity = 30;
+ dVisibility = 40;
+ dSpeed = 20;
+ dFeedback = 80;
+ dFeedbackspeed = 10;
+ dFeedbacksize = 8;
+ dWireframe = 1;
+ dTexture = 3;
+ break;
+
+ case Echo:
+ dWisps = 3;
+ dBackground = 0;
+ dDensity = 25;
+ dVisibility = 30;
+ dSpeed = 20;
+ dFeedback = 85;
+ dFeedbackspeed = 30;
+ dFeedbacksize = 8;
+ dWireframe = 0;
+ dTexture = 1;
+ break;
+
+ case Kaleidoscope:
+ dWisps = 3;
+ dBackground = 0;
+ dDensity = 25;
+ dVisibility = 40;
+ dSpeed = 15;
+ dFeedback = 90;
+ dFeedbackspeed = 3;
+ dFeedbacksize = 8;
+ dWireframe = 0;
+ dTexture = 0;
+ break;
+
+ case Regular:
+ default:
+ dWisps = 5;
+ dBackground = 0;
+ dDensity = 25;
+ dVisibility = 35;
+ dSpeed = 15;
+ dFeedback = 0;
+ dFeedbackspeed = 1;
+ dFeedbacksize = 8;
+ dWireframe = 0;
+ dTexture = 2;
+ break;
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+
+#ifndef UNIT_TEST
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char* kss_applicationName = "keuphoria.kss";
+ KDE_EXPORT const char* kss_description = I18N_NOOP( "Euphoria" );
+ KDE_EXPORT const char* kss_version = "1.0";
+
+ KDE_EXPORT KScreenSaver* kss_create( WId id )
+ {
+ return new KEuphoriaScreenSaver( id );
+ }
+
+ KDE_EXPORT QDialog* kss_setup()
+ {
+ return new KEuphoriaSetup;
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+
+KEuphoriaScreenSaver::KEuphoriaScreenSaver( WId id ) : KScreenSaver( id )
+{
+ _effect = new EuphoriaWidget;
+
+ readSettings();
+
+ embed( _effect );
+ _effect->show();
+}
+
+
+KEuphoriaScreenSaver::~KEuphoriaScreenSaver()
+{
+}
+
+
+static int filterRandom( int n )
+{
+ if( (n < 0) || (n >= EuphoriaWidget::DefaultModes) )
+ {
+ srand((unsigned)time(NULL));
+ n = rand() % EuphoriaWidget::DefaultModes;
+ }
+ return n;
+}
+
+
+void KEuphoriaScreenSaver::readSettings()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ _mode = config->readNumEntry( "Mode", EuphoriaWidget::Regular );
+ _effect->setDefaults( filterRandom(_mode) );
+}
+
+
+/**
+ Any invalid mode will select one at random.
+*/
+void KEuphoriaScreenSaver::setMode( int id )
+{
+ _mode = id;
+ _effect->setDefaults( filterRandom(id) );
+ _effect->updateParameters();
+}
+
+
+//----------------------------------------------------------------------------
+
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <kmessagebox.h>
+
+
+static const char* defaultText[] =
+{
+ I18N_NOOP( "Regular" ),
+ I18N_NOOP( "Grid" ),
+ I18N_NOOP( "Cubism" ),
+ I18N_NOOP( "Bad Math" ),
+ I18N_NOOP( "M-Theory" ),
+ I18N_NOOP( "UHFTEM" ), //"ultra high frequency tunneling electron microscope",
+ I18N_NOOP( "Nowhere" ),
+ I18N_NOOP( "Echo" ),
+ I18N_NOOP( "Kaleidoscope" ),
+ I18N_NOOP( "(Random)" ),
+ 0
+};
+
+
+KEuphoriaSetup::KEuphoriaSetup( QWidget* parent, const char* name )
+ : KDialogBase( parent, name, true, i18n("Setup Euphoria Screen Saver"),
+ Ok|Cancel|Help, Ok, true )
+{
+ setButtonText( Help, i18n( "A&bout" ) );
+
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout* top = new QHBoxLayout(main, 0, spacingHint());
+ QVBoxLayout* leftCol = new QVBoxLayout;
+ top->addLayout( leftCol );
+
+ QLabel* label = new QLabel( i18n("Mode:"), main );
+ leftCol->addWidget( label );
+
+ modeW = new QComboBox( main );
+ int i = 0;
+ while (defaultText[i])
+ modeW->insertItem( i18n(defaultText[i++]) );
+ leftCol->addWidget( modeW );
+
+ leftCol->addStretch();
+
+ // Preview
+ QWidget* preview;
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ _saver = new KEuphoriaScreenSaver( preview->winId() );
+ top->addWidget(preview);
+
+ // Now that we have _saver...
+ modeW->setCurrentItem( _saver->mode() ); // set before we connect
+ connect( modeW, SIGNAL(activated(int)), _saver, SLOT(setMode(int)) );
+
+ setMinimumSize( sizeHint() );
+}
+
+
+KEuphoriaSetup::~KEuphoriaSetup()
+{
+ delete _saver;
+}
+
+
+void KEuphoriaSetup::slotHelp()
+{
+ KMessageBox::about(this,
+ i18n("<h3>Euphoria 1.0</h3>\n<p>Copyright (c) 2002 Terence M. Welsh<br>\n<a href=\"http://www.reallyslick.com/\">http://www.reallyslick.com/</a></p>\n\n<p>Ported to KDE by Karl Robillard</p>"),
+ QString::null, KMessageBox::AllowLink);
+}
+
+
+/**
+ Ok pressed - save settings and exit
+*/
+void KEuphoriaSetup::slotOk()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ QString val;
+ val.setNum( modeW->currentItem() );
+ config->writeEntry("Mode", val );
+
+ config->sync();
+ accept();
+}
+#endif
+//----------------------------------------------------------------------------
+
+
+#ifdef UNIT_TEST
+// moc Euphoria.h -o Euphoria.moc
+// g++ -g -DUNIT_TEST Euphoria.cpp -I/usr/lib/qt3/include -lqt -L/usr/lib/qt3/lib -lGLU -lGL
+
+#include <qapplication.h>
+
+int main( int argc, char** argv )
+{
+ QApplication app( argc, argv );
+
+ EuphoriaWidget w;
+ w.setDefaults( EuphoriaWidget::UHFTEM );
+ app.setMainWidget( &w );
+ w.show();
+
+ return app.exec();
+}
+#endif
+
+
+//EOF
diff --git a/kscreensaver/kdesavers/Euphoria.h b/kscreensaver/kdesavers/Euphoria.h
new file mode 100644
index 00000000..b7de2677
--- /dev/null
+++ b/kscreensaver/kdesavers/Euphoria.h
@@ -0,0 +1,155 @@
+#ifndef __EUPHORIASS_H__
+#define __EUPHORIASS_H__
+//============================================================================
+//
+// Terence Welsh Screensaver - Euphoria
+// http://www.reallyslick.com/
+//
+// KDE port by Karl Robillard
+//
+//============================================================================
+
+
+#include <qgl.h>
+
+#include <kdialogbase.h>
+
+class wisp;
+class QTimer;
+
+class EuphoriaWidget : public QGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ enum eDefault
+ {
+ Regular,
+ Grid,
+ Cubism,
+ BadMath,
+ MTheory,
+ UHFTEM, // ultra high frequency tunneling electron microscope
+ Nowhere,
+ Echo,
+ Kaleidoscope,
+ DefaultModes
+ };
+
+ EuphoriaWidget( QWidget* parent=0, const char* name=0 );
+ ~EuphoriaWidget();
+
+ void updateParameters();
+ void setDefaults( int which );
+
+protected:
+
+ void paintGL();
+ void resizeGL( int w, int h );
+ void initializeGL();
+#ifdef UNIT_TEST
+ void keyPressEvent( QKeyEvent* );
+#endif
+
+private slots:
+
+ void nextFrame();
+
+private:
+
+ GLuint texName;
+ wisp* _wisps;
+ wisp* _backwisps;
+ unsigned char* feedbackmap;
+ float aspectRatio;
+ int viewport[4];
+ double elapsedTime;
+
+ // feedback texture object
+ unsigned int feedbacktex;
+ int feedbacktexsize;
+ // feedback variables
+ float fr[4];
+ float fv[4];
+ float f[4];
+ // feedback limiters
+ float lr[3];
+ float lv[3];
+ float l[3];
+
+
+
+ int dWisps;
+ int dBackground;
+ int dDensity;
+ int dVisibility;
+ float dSpeed;
+ int dFeedback;
+ int dFeedbackspeed;
+ int dFeedbacksize;
+ int dWireframe;
+ int dTexture;
+ int dPriority;
+
+
+ // Using QTimer rather than timerEvent() to avoid getting locked out of
+ // the QEvent loop on lower-end systems. Ian Geiser <geiseri@kde.org>
+ // says this is the way to go.
+ QTimer* _timer;
+ int _frameTime;
+
+ friend class wisp;
+};
+
+
+#ifndef UNIT_TEST
+#include <qdialog.h>
+#include <kscreensaver.h>
+
+
+class KEuphoriaScreenSaver : public KScreenSaver
+{
+ Q_OBJECT
+
+public:
+
+ KEuphoriaScreenSaver( WId id );
+ virtual ~KEuphoriaScreenSaver();
+
+ int mode() const { return _mode; }
+
+public slots:
+
+ void setMode( int );
+
+private:
+
+ void readSettings();
+
+ EuphoriaWidget* _effect;
+ int _mode;
+};
+
+
+class QComboBox;
+
+class KEuphoriaSetup : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ KEuphoriaSetup( QWidget* parent = 0, const char* name = 0 );
+ ~KEuphoriaSetup();
+
+private slots:
+ void slotHelp();
+ void slotOk();
+
+private:
+ QComboBox* modeW;
+ KEuphoriaScreenSaver* _saver;
+};
+#endif
+
+#endif //__EUPHORIASS_H__
diff --git a/kscreensaver/kdesavers/EuphoriaTexture.h b/kscreensaver/kdesavers/EuphoriaTexture.h
new file mode 100644
index 00000000..5a6962b4
--- /dev/null
+++ b/kscreensaver/kdesavers/EuphoriaTexture.h
@@ -0,0 +1,4138 @@
+/*
+ * Copyright (C) 2002 Terence M. Welsh
+ *
+ * Euphoria is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Euphoria is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+#ifndef TEXTURE_H
+#define TEXTURE_H
+
+
+
+#define TEXSIZE 256
+
+
+
+unsigned char plasmamap[TEXSIZE * TEXSIZE] = {
+224,235,221,199,206,186,153,139,173,154,105,108,129,82,34,16,9,12,17,21,21,19,14,5,1,6,21,61,84,114,185,164,183,190,176,161,173,199,191,157,194,193,187,163,150,139,121,114,
+104,84,72,68,63,66,69,66,58,51,44,34,30,28,27,22,17,9,6,9,10,5,0,0,0,6,17,28,37,49,56,64,62,59,64,73,83,88,84,73,75,84,105,130,116,91,97,97,
+109,123,146,189,247,253,178,184,210,186,151,122,84,91,92,90,100,92,88,111,165,219,217,207,204,190,225,252,239,250,255,255,252,252,239,224,191,173,177,165,120,78,66,83,51,50,115,137,
+95,104,150,149,100,86,80,72,75,87,83,58,45,28,24,15,7,2,0,0,1,6,7,3,3,3,8,9,19,36,47,51,45,44,52,71,83,72,61,57,63,86,108,147,191,186,165,172,
+160,147,107,88,95,122,135,157,193,227,241,229,221,229,243,253,255,255,254,252,248,238,229,228,233,245,247,239,246,248,235,226,184,147,98,55,44,36,43,43,34,29,49,59,63,194,255,255,
+255,255,255,255,255,255,255,255,255,242,252,233,213,231,221,228,205,192,193,191,190,175,153,156,173,184,172,127,104,62,24,8,5,9,14,19,23,23,16,6,1,8,30,66,77,114,192,217,
+219,210,177,148,142,149,130,111,147,157,155,162,162,157,154,148,129,100,84,75,68,68,70,63,57,51,45,37,30,28,27,22,16,10,6,7,6,0,0,0,0,1,15,27,35,43,55,62,
+63,58,61,70,88,84,75,73,73,85,111,134,125,101,85,82,107,150,183,186,236,247,133,100,113,107,98,72,63,85,78,83,108,121,116,135,160,163,161,158,155,147,192,246,253,254,254,250,
+253,248,232,233,227,236,224,201,171,149,120,69,83,140,158,130,94,143,142,118,113,120,94,70,62,64,71,55,41,31,29,17,3,0,0,0,0,0,7,7,7,10,14,16,27,45,58,63,
+58,65,78,86,86,77,62,55,59,71,94,130,142,125,114,99,83,84,78,82,92,99,123,169,207,214,224,217,222,233,249,254,252,250,246,226,205,206,210,211,221,245,245,243,248,248,242,226,
+178,99,57,36,28,29,30,30,27,28,64,116,162,235,255,255,255,255,255,255,255,255,255,255,255,255,255,252,203,196,176,203,164,144,121,143,172,180,169,178,163,141,118,85,48,21,6,1,
+1,7,14,20,24,22,15,8,5,10,28,44,71,106,155,208,194,175,140,116,113,98,88,83,88,106,136,158,165,164,153,141,126,109,92,78,70,65,63,63,56,49,43,37,33,28,26,22,
+16,14,8,5,0,0,0,0,0,0,9,22,31,38,49,57,61,59,59,64,92,94,100,80,78,107,136,143,154,121,84,94,165,183,140,158,253,218,84,68,68,73,76,56,52,44,47,88,
+153,162,144,146,149,163,186,172,156,196,227,245,248,238,234,241,247,232,199,211,221,219,191,141,168,175,164,137,153,178,151,112,102,151,144,104,111,123,76,40,33,34,29,27,29,19,19,9,
+0,0,0,0,0,3,7,7,10,15,19,23,35,49,56,61,68,83,92,88,80,70,59,51,50,52,64,98,100,65,51,50,63,70,77,84,80,91,108,168,217,199,194,205,227,243,253,253,
+252,243,224,187,160,163,191,203,215,225,238,241,241,241,239,221,190,106,50,27,23,21,21,28,27,24,62,130,211,255,255,255,255,254,254,255,255,255,255,255,255,255,248,243,224,200,190,182,
+91,79,72,79,73,132,164,172,140,61,22,23,16,6,0,0,0,2,12,20,21,20,17,10,9,14,20,28,65,98,104,147,142,141,123,111,94,87,84,78,78,84,97,123,146,149,126,106,
+111,109,95,84,71,64,63,64,52,44,41,34,30,27,24,23,19,14,9,7,2,0,1,0,0,0,8,19,33,43,49,62,76,75,66,65,86,99,104,73,88,133,149,165,175,132,114,143,
+185,187,123,127,238,203,72,61,54,59,71,48,38,43,85,148,189,183,133,154,157,175,184,177,184,219,238,253,247,222,236,243,234,229,206,194,207,180,141,97,123,132,118,126,142,151,143,122,
+128,147,156,144,109,87,50,20,13,19,10,3,5,2,1,0,0,0,12,16,3,7,13,8,14,16,22,31,41,57,69,72,84,90,90,75,66,59,50,44,40,36,43,57,49,33,30,34,
+42,51,66,77,84,109,115,168,219,204,185,205,240,246,250,252,248,232,215,200,190,190,201,213,213,220,194,210,229,231,235,204,162,102,55,35,26,26,26,28,30,29,45,92,170,239,247,246,
+235,235,254,255,255,255,255,255,255,255,253,253,222,198,183,126,75,57,49,61,61,82,121,134,125,50,13,6,0,0,0,0,0,0,8,17,21,23,20,16,22,22,16,28,44,52,61,77,
+91,106,97,79,69,63,65,70,78,90,118,146,155,136,118,102,104,102,90,82,72,64,61,58,48,40,34,29,27,23,23,21,20,15,14,12,7,5,6,5,2,6,15,23,31,43,56,77,
+114,98,86,76,76,71,70,66,109,151,187,203,170,153,155,193,194,161,116,113,154,134,71,65,51,49,61,44,37,61,113,140,134,119,113,149,191,200,187,198,171,198,208,193,199,176,201,228,
+219,213,175,192,196,155,109,73,72,71,59,50,83,115,120,115,121,107,95,83,61,37,21,8,6,13,8,0,0,0,0,0,1,28,30,15,5,8,10,17,22,23,28,38,47,71,72,65,
+76,78,73,62,52,44,40,35,30,30,31,33,28,27,29,30,40,59,98,109,101,122,155,205,219,218,207,219,245,241,229,248,229,226,218,212,214,210,184,153,168,157,140,139,178,199,207,184,
+134,90,55,42,37,35,33,30,34,41,45,65,109,167,196,208,218,235,255,255,255,255,255,255,255,255,255,255,218,150,133,106,82,51,43,40,50,52,69,88,78,36,10,3,0,0,0,0,
+0,0,8,20,26,26,27,27,35,30,19,22,34,34,37,47,47,57,55,49,45,44,47,61,86,125,148,155,161,128,106,99,92,86,82,76,70,65,61,55,43,35,28,26,23,20,16,15,
+17,16,17,19,15,13,10,8,7,10,16,26,28,41,68,87,92,105,107,73,56,50,64,86,106,130,185,196,182,197,180,193,210,143,99,92,104,85,71,63,49,47,50,44,45,68,93,120,
+111,102,116,155,179,161,168,186,182,162,143,106,120,105,140,180,207,165,128,150,144,109,82,54,27,19,15,17,30,34,58,78,77,55,24,14,19,16,12,7,8,16,14,3,0,1,1,0,
+19,44,28,13,8,14,19,24,30,37,41,41,55,75,66,58,55,57,59,56,45,35,30,26,24,27,23,23,22,23,33,49,63,108,158,123,101,147,193,229,224,224,224,231,238,186,125,142,
+130,180,217,218,210,162,119,80,86,82,83,71,102,151,171,162,112,71,56,41,35,35,31,33,37,45,50,57,72,101,130,158,217,255,255,255,255,255,255,255,255,255,255,255,215,125,115,112,
+97,66,58,43,40,44,34,37,35,23,10,3,0,0,0,0,0,2,16,33,36,38,40,31,27,20,19,23,34,37,33,30,27,35,37,40,34,34,45,68,98,95,78,78,85,79,80,79,
+76,77,75,71,69,65,63,52,42,35,30,26,23,17,14,14,16,19,21,20,19,19,19,16,14,14,21,27,31,45,78,100,91,99,101,70,44,45,68,104,113,149,186,221,249,253,232,208,
+217,129,122,125,78,66,63,51,43,47,51,54,59,79,101,115,87,76,101,127,130,123,153,175,168,122,100,84,95,98,121,141,167,135,137,141,118,106,66,24,9,9,10,12,16,13,15,27,
+23,20,8,13,14,9,7,10,26,30,24,14,10,10,9,10,14,21,23,23,20,22,34,33,34,42,61,62,62,58,58,69,65,51,50,49,40,35,31,26,22,19,22,26,26,35,48,73,
+120,162,187,161,126,180,229,229,224,227,234,228,147,90,54,37,45,115,208,200,146,87,77,77,72,73,82,78,90,102,108,136,113,83,49,29,34,35,34,35,36,37,38,43,51,56,61,111,
+183,248,255,255,255,255,255,255,255,255,255,255,228,136,111,123,109,85,73,52,44,44,30,22,19,12,8,3,2,0,1,2,3,8,34,50,36,44,49,37,23,16,16,31,59,58,31,20,
+16,22,27,28,31,47,65,99,112,57,42,52,61,58,61,65,69,71,69,65,65,61,57,49,38,35,31,26,22,17,13,15,17,21,26,26,24,27,29,27,24,23,27,31,36,54,78,107,
+129,139,119,75,49,45,62,107,171,247,255,253,255,255,255,252,233,156,165,171,76,58,56,43,42,49,51,69,85,95,102,106,87,73,79,78,87,104,128,144,135,98,88,104,108,121,139,133,
+137,113,130,135,95,93,69,21,13,10,10,15,9,3,1,3,0,0,3,19,21,14,15,15,27,37,36,24,20,20,20,20,19,21,21,24,30,59,75,61,61,57,85,84,62,54,63,85,
+78,51,45,48,44,44,36,29,24,21,23,27,43,73,100,132,156,177,172,162,147,187,232,224,219,235,241,194,101,51,28,31,43,116,182,179,148,105,100,120,112,115,128,134,112,97,100,122,
+72,48,37,38,42,43,38,34,33,37,41,43,45,42,52,73,128,178,226,255,255,255,255,255,255,248,225,232,179,123,130,137,84,79,73,64,62,47,31,23,19,13,9,9,8,8,9,9,
+12,20,42,45,30,41,55,51,33,20,22,65,107,73,36,23,21,19,20,22,30,37,56,82,93,66,45,52,61,52,51,59,63,68,65,62,62,56,50,42,35,35,34,28,22,20,17,20,
+24,24,28,31,31,35,36,37,33,31,33,36,41,54,76,121,170,163,142,84,55,49,62,98,144,193,229,255,255,255,254,253,245,176,172,128,63,50,48,41,44,52,66,91,106,116,111,102,
+86,86,72,65,78,92,105,120,119,104,113,136,135,140,126,102,100,112,109,93,62,63,56,23,13,10,16,21,10,1,6,17,2,0,15,30,29,28,22,17,28,40,40,33,28,27,28,30,
+40,37,34,47,73,109,125,112,73,55,80,93,76,69,66,77,68,54,54,57,50,44,38,35,36,40,36,40,86,146,167,175,184,191,186,162,155,194,222,211,192,205,211,162,85,45,30,33,
+31,36,72,148,149,125,126,150,135,126,126,126,106,111,147,119,56,43,50,50,48,49,44,40,38,43,49,54,61,51,54,64,97,123,175,219,247,255,255,255,255,222,178,167,140,115,129,122,
+80,69,69,85,92,62,42,35,30,20,16,16,14,16,19,19,20,29,45,42,36,55,65,65,50,34,66,119,99,62,50,35,31,28,27,35,40,31,37,66,92,92,72,87,72,51,58,65,
+65,65,59,58,55,49,45,38,34,31,33,28,23,23,23,26,28,29,33,36,42,41,41,42,42,37,36,38,47,59,90,136,165,146,154,86,54,57,65,65,73,94,189,255,255,255,255,254,
+254,245,147,80,57,50,49,48,48,56,77,106,121,129,118,98,91,94,78,77,77,79,88,100,111,127,141,162,170,161,121,78,76,105,115,93,77,55,40,21,6,8,14,22,26,12,22,36,
+10,10,31,44,40,22,26,26,37,50,49,47,42,38,41,44,55,42,52,84,108,128,129,118,73,61,91,114,104,65,57,59,65,75,63,54,44,37,33,42,59,93,84,99,171,208,199,196,
+218,217,199,179,184,208,213,185,136,129,141,90,51,38,28,28,29,23,27,64,102,100,115,112,76,94,123,125,143,139,141,100,50,52,56,56,54,50,45,44,43,47,54,66,69,50,50,59,
+93,118,171,189,204,243,255,253,213,156,140,144,126,112,129,108,116,115,112,105,100,75,52,45,37,27,24,24,23,27,30,26,30,31,47,62,93,106,85,75,70,70,112,130,101,82,76,62,
+63,45,28,43,33,30,82,122,119,120,92,85,87,97,101,79,65,58,54,51,48,45,42,38,36,30,33,31,29,27,29,31,34,36,41,44,47,48,47,48,45,41,40,43,49,71,92,123,
+153,121,115,97,75,75,78,66,64,68,108,170,217,211,232,255,255,215,97,69,58,55,51,51,55,66,85,111,127,132,136,134,125,111,106,106,66,56,62,76,94,118,156,170,154,148,130,91,
+125,128,112,102,84,68,40,21,10,7,19,34,27,15,26,30,14,22,43,54,57,34,37,37,42,54,56,55,51,52,52,51,55,48,57,79,102,121,122,107,102,112,111,111,100,66,57,57,
+54,59,50,42,38,36,43,69,115,160,180,217,242,236,225,225,227,191,171,187,217,245,242,192,111,84,68,54,44,33,28,28,22,16,17,23,38,45,51,55,43,42,77,135,178,175,140,94,
+55,50,56,57,54,49,48,44,44,44,55,76,75,44,40,64,80,95,161,189,184,238,254,225,155,92,93,127,118,107,123,137,173,171,158,136,92,80,71,57,33,28,35,37,40,33,37,40,
+41,35,51,80,104,98,79,80,95,129,141,108,90,82,88,83,82,63,56,69,51,68,101,140,136,107,71,70,99,122,107,76,58,51,51,47,43,40,38,35,34,36,35,33,31,33,35,37,
+41,41,45,49,51,54,52,51,49,48,50,50,57,83,94,106,142,123,100,107,98,97,95,82,63,56,61,80,114,139,187,246,241,207,112,88,72,62,55,55,62,77,101,123,140,151,162,172,
+160,121,90,75,47,38,45,57,70,90,162,196,146,149,175,142,148,123,100,102,71,51,33,29,27,24,42,42,22,17,34,35,20,31,43,43,66,75,70,51,51,56,57,55,59,63,57,54,
+58,45,51,65,86,120,126,132,120,109,118,106,92,76,64,57,48,54,42,35,38,54,85,153,201,215,240,255,254,248,247,250,250,194,180,235,253,255,255,193,90,70,57,50,47,42,34,28,
+17,10,13,20,22,23,29,35,36,36,40,69,164,183,135,77,59,49,51,52,48,49,49,47,45,42,58,72,68,45,41,66,76,77,136,189,197,218,214,190,164,119,119,120,111,129,133,173,
+201,205,210,189,128,82,77,63,47,42,44,71,79,55,49,44,38,55,83,82,70,68,58,68,147,163,147,118,84,75,79,79,77,116,146,123,112,104,70,90,137,128,102,114,114,99,95,71,
+50,44,43,41,37,37,36,30,31,35,35,33,33,34,40,43,43,44,50,55,56,56,57,59,57,59,65,63,77,93,105,135,137,139,107,86,85,80,88,80,52,47,55,66,85,100,128,196,
+212,203,167,148,93,65,62,62,73,82,97,121,146,168,180,169,141,107,68,38,26,23,42,64,80,92,164,199,175,165,171,180,142,94,88,98,65,42,35,33,40,36,45,41,27,29,51,47,
+30,40,42,38,55,57,68,68,66,65,70,72,78,70,62,58,48,42,58,78,97,116,132,146,113,118,118,94,63,64,58,48,40,36,34,33,40,72,154,233,255,253,253,255,255,255,255,255,
+252,241,241,255,255,252,254,175,91,90,73,52,48,45,38,29,20,14,10,9,12,15,19,24,30,38,40,48,127,162,136,93,56,44,43,45,48,48,49,44,41,42,52,62,62,48,43,58,
+70,77,126,160,167,176,177,165,157,125,121,115,115,155,172,199,210,211,211,206,170,105,80,65,98,101,101,147,129,102,72,45,38,80,101,100,68,70,65,78,144,153,165,175,148,95,84,80,
+70,119,161,135,136,122,78,86,147,160,150,121,97,86,78,55,40,37,37,36,38,40,37,33,28,31,34,36,38,40,42,44,45,48,55,59,59,62,64,64,65,79,86,79,83,90,118,167,
+175,133,90,48,54,65,78,72,51,42,50,57,70,105,156,165,162,175,176,142,97,71,72,71,83,97,105,100,109,139,162,144,106,79,50,28,21,27,49,104,153,160,175,183,176,167,135,165,
+137,85,88,92,62,42,38,41,49,48,52,40,36,43,61,65,50,62,62,55,51,48,56,68,70,88,76,71,79,84,90,73,58,75,86,92,111,129,137,142,137,146,136,113,75,61,51,45,
+40,30,28,29,45,109,215,255,255,254,255,255,255,255,255,255,254,255,253,254,250,248,248,227,196,179,135,86,61,58,52,44,29,14,6,5,5,6,13,21,28,33,35,42,95,148,136,87,
+48,43,36,40,45,47,48,45,44,45,54,58,62,52,44,52,70,105,133,142,172,183,190,164,137,122,129,150,175,193,200,210,193,203,217,214,194,168,157,150,179,204,213,196,172,157,108,64,
+54,80,115,120,70,73,101,115,135,143,168,196,171,140,114,78,87,136,172,164,149,147,105,93,109,98,90,91,72,54,52,40,30,33,35,37,38,38,33,29,27,29,31,38,41,44,42,44,
+47,51,57,59,63,69,72,73,86,112,104,88,77,79,113,168,179,102,50,35,43,63,66,58,49,42,37,36,55,111,164,147,132,158,167,129,91,77,78,80,90,116,122,100,100,105,125,133,
+95,85,56,34,27,36,51,120,168,204,193,162,130,123,126,150,123,102,93,84,58,43,43,58,76,71,58,49,52,71,71,68,84,100,91,62,63,57,50,61,85,102,76,69,71,85,105,100,
+122,134,98,59,102,154,141,135,142,136,133,108,106,82,59,49,42,31,28,33,66,161,249,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,249,236,225,197,176,154,118,99,83,79,
+51,9,0,0,0,0,12,24,35,41,35,41,83,125,113,66,71,72,56,50,56,59,57,65,73,80,91,94,92,78,55,59,109,136,150,172,189,196,191,157,127,142,157,183,214,211,214,205,
+177,200,242,239,234,228,227,224,217,225,234,217,208,189,137,141,150,158,194,172,94,123,142,155,161,167,179,180,178,191,148,121,137,179,189,175,155,140,107,63,37,48,59,64,48,41,41,33,
+33,37,41,38,37,37,31,26,30,31,34,38,42,43,42,43,48,52,59,63,68,73,78,85,107,137,129,92,76,79,106,135,112,68,43,38,44,45,43,45,41,45,40,45,83,141,172,146,
+126,125,156,163,121,97,91,95,104,134,137,116,118,114,122,128,90,73,52,36,30,45,48,102,168,208,193,154,136,153,160,132,105,100,87,64,45,45,47,65,76,71,58,69,86,98,97,105,
+111,108,95,72,62,50,45,59,108,108,69,76,79,82,106,141,168,160,90,57,76,146,155,143,130,126,114,107,115,107,71,48,30,30,33,40,90,203,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,254,253,241,215,201,205,184,111,95,84,66,40,10,1,0,0,6,22,33,42,52,47,70,113,120,78,83,118,112,114,111,105,128,113,122,147,164,158,144,125,99,64,70,
+107,139,175,193,191,193,167,137,163,203,205,222,218,212,222,200,220,242,255,248,249,254,253,247,242,242,243,241,241,214,201,231,221,193,196,203,162,170,140,148,148,147,153,168,182,203,193,189,
+205,198,189,177,151,118,85,52,33,30,41,42,38,34,29,30,41,52,49,45,38,35,34,30,34,36,35,40,42,43,43,47,49,52,58,63,71,78,83,90,107,123,113,85,77,86,97,97,
+70,56,51,49,51,43,37,50,54,56,62,75,129,173,190,171,157,156,171,177,147,109,87,99,112,136,139,150,160,157,164,151,121,86,50,29,26,49,55,80,119,170,217,180,170,177,139,107,
+99,86,77,55,38,42,45,51,56,62,83,107,114,102,129,150,118,97,99,85,68,51,52,68,102,105,79,97,104,97,105,154,173,148,129,121,121,141,147,144,134,129,125,132,134,104,58,35,
+23,27,35,43,97,211,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,243,228,218,206,189,154,143,100,61,26,9,3,8,19,26,27,41,56,51,44,86,76,34,24,35,
+79,142,169,168,150,156,160,180,201,205,185,165,141,99,77,79,93,133,175,184,193,185,133,149,179,215,240,234,226,218,228,229,249,255,254,254,255,255,255,255,255,255,254,255,254,248,255,250,
+218,183,169,196,176,196,191,142,95,100,156,148,176,200,200,212,212,200,142,149,141,84,51,35,33,37,37,33,34,31,34,36,48,61,52,41,35,30,30,31,36,36,37,41,44,47,47,49,
+51,54,59,68,75,82,86,90,101,120,97,77,75,82,85,80,63,51,58,66,65,65,64,71,77,73,77,114,163,213,232,236,228,225,214,158,170,114,106,132,133,133,130,170,192,182,189,170,
+132,94,55,30,24,33,40,76,84,80,204,199,197,160,82,91,97,68,63,55,41,41,48,54,70,93,132,134,109,94,121,144,142,150,130,82,62,47,49,82,104,93,97,118,150,141,151,176,
+183,165,160,164,163,153,137,132,137,133,130,144,134,71,34,19,21,30,47,69,113,219,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,253,249,245,239,226,210,182,164,149,101,49,
+20,13,10,27,44,40,30,52,58,45,41,59,33,22,29,38,63,108,173,156,129,136,149,182,205,205,192,182,161,137,129,107,106,128,156,175,215,185,167,190,170,189,239,240,249,246,249,252,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,242,236,218,200,186,197,177,135,134,172,169,141,187,191,183,194,201,172,91,105,114,69,49,40,40,47,41,33,31,35,41,38,
+37,42,47,42,31,30,31,33,35,40,43,43,52,57,54,55,56,58,63,71,77,84,92,99,102,114,97,79,76,82,80,70,58,54,71,88,87,86,79,91,95,92,106,143,193,240,255,255,
+255,255,214,129,140,133,167,176,170,157,168,187,205,198,192,160,109,65,34,30,30,26,29,55,78,87,151,192,177,105,77,93,79,57,52,49,44,49,61,94,127,113,118,112,95,98,120,128,
+133,167,128,75,63,43,49,87,112,114,112,128,167,177,182,194,194,161,146,164,173,167,157,155,160,153,148,153,120,42,21,22,38,56,115,189,213,248,255,255,255,255,255,255,255,255,255,254,
+255,255,255,255,255,255,253,248,240,171,121,100,95,97,58,31,22,20,23,42,57,48,54,90,88,68,61,65,57,42,44,62,94,118,154,142,151,171,189,199,207,204,200,199,196,194,179,132,
+125,128,154,173,212,213,178,151,144,192,232,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,246,218,199,213,201,178,173,187,183,184,116,126,176,193,157,168,
+179,151,109,85,71,61,51,45,41,40,38,40,41,41,44,33,24,29,37,36,30,29,31,35,38,48,55,57,59,63,64,61,61,61,65,78,86,95,106,112,119,121,105,83,73,73,70,66,
+61,63,88,115,113,108,102,105,112,130,158,186,214,250,255,255,255,252,236,201,168,168,194,203,179,184,200,204,212,219,192,157,98,49,26,29,35,41,49,50,51,70,113,179,169,94,102,88,
+58,50,48,50,54,66,86,129,164,113,85,90,92,93,121,120,115,154,123,85,77,51,57,85,126,139,147,154,157,185,182,180,183,177,178,184,180,170,171,167,167,160,144,126,68,21,28,62,
+79,123,217,255,255,255,255,255,255,255,255,255,255,254,248,245,255,247,180,197,213,186,212,241,194,91,66,87,102,92,61,29,24,24,34,51,70,72,73,85,121,119,78,92,95,58,64,79,
+120,144,160,167,183,196,217,226,232,227,220,212,206,193,178,128,127,139,154,150,136,183,176,149,179,226,226,245,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,
+229,200,187,212,236,228,221,211,185,139,85,128,149,161,118,107,151,156,120,82,80,71,59,49,33,31,41,47,52,56,49,26,19,23,28,31,31,33,37,41,47,55,65,75,69,68,70,71,
+70,66,70,83,100,109,125,141,156,146,132,111,100,83,68,68,77,86,108,136,147,139,136,123,116,157,205,218,224,250,255,255,255,235,232,198,176,175,191,201,177,185,199,220,227,224,197,176,
+99,57,35,41,57,65,63,49,54,76,149,187,200,143,90,68,52,55,59,62,80,100,116,132,129,98,85,90,106,113,139,123,118,119,111,99,85,65,72,104,151,158,169,162,135,151,184,177,
+186,215,221,210,198,177,175,161,161,157,94,37,29,29,44,65,99,176,253,255,255,255,255,255,255,255,255,255,255,252,234,227,231,160,54,52,63,65,95,160,137,66,57,64,90,84,57,31,
+30,41,56,70,82,78,65,83,111,119,115,148,118,64,77,102,143,173,191,206,219,231,246,250,250,247,239,227,212,192,189,134,102,126,133,123,97,151,200,201,224,238,241,252,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,240,236,247,242,248,241,238,225,167,139,144,165,123,132,136,98,108,107,83,94,98,97,92,82,70,45,50,57,56,65,45,27,
+21,26,28,31,40,44,48,52,59,64,70,75,75,79,83,82,78,72,77,84,102,121,143,167,189,164,156,149,132,101,97,95,102,107,107,135,157,147,160,157,151,186,210,232,249,254,255,255,
+255,227,198,205,183,185,178,185,196,199,197,206,211,207,185,160,106,85,71,84,115,105,85,64,59,93,178,219,218,182,109,88,73,77,86,115,160,168,161,137,121,114,112,120,129,129,141,130,
+120,122,121,88,79,86,102,151,177,156,171,170,108,115,167,190,221,236,234,229,219,187,177,162,168,111,20,7,31,30,35,27,33,100,247,255,235,247,255,255,255,255,255,255,255,252,228,213,
+137,73,45,36,38,45,50,92,107,63,56,51,51,44,33,33,41,66,90,80,70,73,61,61,102,100,153,169,128,92,78,112,144,176,224,238,243,254,255,255,255,254,255,240,208,192,186,130,
+90,102,91,92,90,127,186,224,224,236,249,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,247,249,253,247,245,241,225,217,221,226,205,153,146,118,95,
+77,70,86,107,105,120,125,132,128,83,68,69,55,54,42,30,24,31,40,44,52,58,61,65,69,72,71,71,73,77,80,83,80,75,80,101,121,135,150,172,196,180,171,172,160,129,109,126,
+132,146,149,148,164,163,168,176,197,222,210,224,250,255,255,255,255,246,220,228,217,189,169,203,218,205,199,198,178,189,182,160,130,112,112,141,176,147,92,84,88,121,190,218,219,215,171,129,
+98,104,142,206,242,241,239,212,170,142,132,137,139,136,141,143,120,137,116,98,115,126,142,190,197,170,176,164,111,112,136,162,211,228,229,226,212,198,184,180,156,62,0,0,12,8,12,14,
+9,35,150,222,211,245,255,255,255,255,255,255,255,250,232,208,122,73,56,49,48,50,50,76,93,72,62,56,43,34,29,33,42,54,79,70,69,85,68,68,106,113,151,142,161,157,115,93,
+123,183,238,250,255,255,255,255,255,255,250,198,173,189,182,148,101,91,78,78,86,109,132,173,220,240,243,254,255,255,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,254,253,250,250,247,245,236,236,233,221,161,114,87,92,79,92,106,120,133,142,156,164,112,72,70,63,63,49,40,33,30,37,49,56,62,66,70,72,70,68,65,69,71,75,75,76,
+78,76,79,120,154,149,149,186,212,190,171,197,192,161,93,82,112,178,197,186,183,182,173,191,226,224,212,222,248,254,255,255,255,253,240,231,208,184,203,234,221,198,205,212,189,187,193,185,
+182,177,196,201,179,182,112,106,119,185,186,189,217,239,222,194,161,154,220,255,255,255,255,238,190,165,157,155,153,151,147,140,127,139,141,133,136,135,167,212,205,197,199,150,126,129,129,155,
+206,226,231,224,206,204,182,178,136,70,24,16,15,24,29,21,9,7,30,115,146,171,234,245,236,253,255,255,255,250,247,236,151,83,65,61,50,43,47,63,77,78,72,57,41,33,29,33,
+41,45,50,49,61,76,78,80,92,135,126,142,176,137,100,112,127,189,239,247,255,255,255,255,255,254,231,170,167,185,183,158,107,98,90,93,105,120,127,141,197,234,240,254,255,255,254,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,248,247,247,234,225,214,190,156,119,102,104,122,137,134,141,137,150,182,185,111,55,52,56,65,51,49,44,
+31,37,47,56,61,62,65,65,64,65,66,70,75,75,76,72,72,73,77,102,148,175,183,196,215,217,198,192,194,146,78,62,90,171,189,158,146,150,142,180,226,210,215,225,229,232,242,252,
+255,255,247,220,199,192,232,248,228,213,213,218,208,204,203,201,212,239,255,245,207,206,178,143,156,211,213,219,242,248,249,245,228,219,240,255,255,255,255,245,219,205,196,220,224,204,200,172,
+146,153,162,160,141,148,177,213,226,235,224,158,125,164,153,167,212,228,231,225,203,200,211,184,128,90,95,137,125,107,66,33,16,12,28,37,41,88,196,225,232,254,255,255,255,254,255,253,
+186,98,70,66,58,49,52,61,71,77,70,52,40,33,30,30,36,38,38,34,43,58,77,76,95,151,160,156,116,101,113,143,172,192,211,228,234,250,255,255,255,255,221,191,192,193,182,146,
+105,120,121,126,139,154,144,130,185,227,242,253,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,248,248,243,236,231,221,192,187,182,170,167,
+175,157,120,126,119,134,169,185,134,73,59,62,68,56,47,38,35,36,37,48,54,56,58,58,59,64,68,75,83,79,79,80,76,72,73,86,122,155,190,191,191,205,196,163,158,161,98,73,
+85,125,158,161,123,113,112,151,194,201,200,201,197,191,207,234,247,234,224,207,190,193,221,233,221,204,208,222,222,232,219,225,229,245,255,255,248,235,255,238,245,247,247,239,254,255,255,253,
+250,249,254,255,255,255,255,255,250,252,248,250,255,252,255,240,225,217,193,191,192,182,187,221,238,243,228,193,165,185,156,185,217,226,227,217,193,158,184,208,162,142,160,192,199,135,86,58,
+35,24,42,56,38,90,173,224,240,255,255,255,255,255,255,255,198,106,71,68,62,55,61,65,75,72,64,50,38,31,34,35,37,36,33,30,36,43,55,61,105,161,143,127,115,116,135,150,
+199,194,197,207,187,226,255,255,255,253,219,203,208,196,167,128,112,132,140,149,161,155,157,154,199,235,247,252,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,250,242,245,240,238,241,236,231,233,231,220,211,192,162,133,120,100,105,135,155,121,85,87,100,59,49,45,43,57,52,43,47,58,59,61,69,77,92,104,109,125,112,101,99,
+100,90,78,82,93,133,210,221,194,191,197,170,146,191,155,104,125,160,170,164,123,125,118,132,142,147,179,191,182,162,182,212,214,201,197,183,179,185,204,212,199,189,214,232,229,217,218,235,
+235,238,252,255,255,255,255,255,255,255,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,255,255,255,255,255,249,242,246,250,234,227,242,249,246,239,213,193,200,178,201,
+220,226,224,207,164,127,154,149,177,210,164,153,184,151,121,86,61,41,50,68,68,99,175,214,240,255,255,255,255,255,255,243,165,98,77,69,63,58,62,72,78,68,64,58,48,34,36,41,
+43,38,33,30,31,35,34,42,88,128,109,93,135,154,168,184,189,171,190,172,161,226,254,255,255,248,218,194,206,193,163,143,141,140,160,169,173,167,161,156,194,234,242,249,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,234,239,235,228,227,233,239,239,232,217,207,194,175,151,116,91,85,108,122,73,69,86,105,63,43,48,66,
+87,92,107,88,106,116,100,122,153,164,162,167,170,164,148,136,119,107,91,95,115,154,194,180,184,193,199,182,167,199,198,167,179,207,205,180,120,115,113,107,123,114,143,164,157,153,167,182,
+187,182,171,157,160,171,192,205,183,176,199,211,203,180,211,239,245,247,245,254,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,253,252,248,236,220,208,196,220,228,233,228,211,163,132,182,148,192,238,168,184,187,149,148,106,73,58,49,51,64,86,160,191,212,255,255,255,255,255,255,217,
+130,91,85,75,68,65,64,82,82,66,63,59,55,41,41,45,47,38,33,31,33,41,47,44,48,59,65,66,93,141,189,211,197,167,142,151,162,194,228,249,238,222,204,193,205,194,156,154,
+176,178,192,208,198,178,176,169,201,228,234,224,243,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,246,253,255,255,248,236,238,236,233,226,222,226,229,226,212,203,
+193,176,149,122,91,73,98,94,57,61,65,71,66,41,28,26,68,139,158,137,115,132,143,171,182,185,176,147,139,157,171,171,142,116,94,105,128,137,157,156,136,170,192,189,169,190,207,201,
+197,199,189,179,121,91,91,73,78,82,95,116,115,108,125,139,153,155,136,133,142,160,183,185,178,160,163,155,154,162,199,234,248,252,254,255,255,255,255,255,255,255,255,255,253,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,246,242,240,234,233,241,245,246,235,218,176,143,186,207,215,162,142,206,229,177,133,107,
+72,79,93,108,105,100,132,177,196,232,228,239,255,255,255,219,150,111,87,73,66,66,72,86,85,76,79,73,62,47,43,47,47,43,40,35,34,36,41,43,36,36,45,69,85,137,189,158,
+155,141,134,151,168,150,161,189,191,185,175,175,182,182,179,194,203,194,189,201,200,200,192,179,208,228,221,197,220,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,248,252,250,
+250,253,253,253,248,240,240,236,232,226,225,222,220,218,208,203,191,173,151,123,92,80,84,73,73,65,58,64,62,57,35,12,8,107,144,51,22,37,57,132,172,170,132,112,136,153,168,177,
+139,128,97,93,109,111,126,168,148,140,158,162,158,171,180,189,190,179,160,156,146,102,64,52,42,44,59,83,83,79,97,104,119,122,116,120,137,154,178,171,168,153,161,142,143,165,198,234,
+252,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,249,233,203,214,232,229,242,250,252,
+253,252,243,224,180,157,193,218,196,141,133,161,219,233,170,104,68,88,79,82,87,136,165,192,199,163,172,212,252,255,255,234,183,130,79,61,58,59,71,101,109,93,94,85,64,51,57,63,
+65,63,45,42,40,30,33,33,29,35,50,90,98,115,146,120,123,121,126,127,130,127,143,163,170,161,160,164,176,183,201,221,205,199,205,199,193,213,215,204,197,210,192,186,218,249,255,255,
+255,255,255,249,255,255,255,255,255,255,255,255,254,248,250,253,254,254,253,252,248,246,240,243,240,232,234,225,225,219,211,199,170,142,125,108,79,90,80,57,63,61,45,47,38,52,45,15,
+0,54,76,10,14,29,42,95,149,154,144,155,160,164,157,161,156,155,112,86,91,101,106,129,154,154,127,132,144,143,119,146,167,150,134,135,125,75,31,23,22,24,36,55,58,64,76,82,
+95,101,108,114,129,140,153,147,129,140,151,146,156,187,225,243,246,255,255,255,255,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,235,182,160,178,214,225,238,247,253,255,255,247,224,176,151,190,206,168,154,137,82,77,151,155,113,66,70,48,29,36,99,189,196,175,154,190,217,239,255,255,250,
+197,115,71,65,64,62,71,111,119,104,99,92,73,72,73,77,90,78,50,43,38,35,34,30,33,54,71,88,86,92,111,90,80,79,92,122,139,119,121,143,142,134,142,165,178,187,211,229,
+217,229,242,229,212,217,225,224,217,200,192,171,214,249,255,255,255,255,245,238,254,255,255,255,255,255,252,246,245,241,252,252,252,254,254,253,247,247,246,243,235,241,243,240,236,218,207,178,
+144,108,86,93,88,82,66,57,49,38,22,21,28,33,35,14,3,12,14,10,16,33,48,90,160,177,176,175,164,155,129,143,172,171,148,106,85,97,106,116,150,158,125,108,108,98,64,93,
+119,113,116,113,76,27,13,10,13,20,34,49,54,57,61,68,84,100,115,125,135,149,153,142,119,126,146,169,190,215,240,245,248,255,255,255,255,255,255,255,255,255,255,255,255,254,254,253,
+250,255,255,249,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,238,224,253,247,187,164,177,204,234,240,250,255,255,255,246,225,199,162,180,193,142,93,84,57,42,70,98,87,
+47,33,36,41,80,109,126,165,163,169,199,203,231,242,249,229,170,97,71,76,75,71,78,101,132,139,120,111,99,105,98,90,87,64,44,38,34,36,36,31,31,45,61,66,68,66,79,59,
+54,62,73,122,139,99,92,108,122,148,156,170,186,197,213,221,231,250,252,239,221,222,232,225,219,207,200,170,220,249,254,255,231,220,203,215,247,255,255,255,255,255,240,228,239,245,249,248,
+249,252,254,252,250,252,248,240,236,241,247,241,232,204,199,182,160,108,77,82,84,93,77,59,41,24,13,10,15,16,15,9,5,7,8,15,16,26,40,64,148,180,175,165,149,150,146,144,
+158,165,164,139,100,86,93,115,132,127,108,92,85,80,61,73,79,83,85,82,44,19,7,5,15,28,48,59,61,61,58,64,78,101,118,136,164,183,163,155,153,149,147,182,210,218,221,232,
+245,252,254,255,255,255,255,255,255,255,255,255,255,255,255,253,233,236,238,241,248,255,255,255,255,255,255,255,255,255,255,255,255,255,232,218,199,168,213,249,208,161,175,207,228,242,253,255,
+255,255,243,220,196,182,169,147,111,63,56,40,33,38,62,47,36,28,23,28,71,106,119,155,182,168,173,155,149,139,142,139,100,80,71,76,78,76,80,98,134,162,140,112,102,106,109,101,
+71,48,38,34,33,34,30,27,30,38,52,52,57,52,54,44,54,68,95,137,122,95,100,123,168,182,171,172,182,207,218,229,240,248,253,254,247,233,227,231,240,206,179,172,222,255,255,247,
+172,158,176,200,225,252,254,255,255,255,250,245,236,236,241,236,247,250,255,253,248,233,235,241,246,247,246,238,224,208,191,167,128,107,73,56,78,93,82,57,27,13,12,14,16,13,10,8,
+8,15,17,14,12,15,24,33,70,132,153,130,104,107,134,147,157,149,155,162,125,69,72,86,99,105,93,77,63,62,61,59,61,72,66,55,33,14,5,1,19,47,79,94,84,75,62,68,
+83,104,126,150,171,194,176,168,170,157,146,182,222,228,227,234,241,235,229,248,255,255,255,255,255,255,255,255,255,255,249,246,231,206,221,235,249,255,255,255,255,255,255,255,255,255,255,255,
+255,253,221,208,217,190,165,180,175,162,177,201,228,246,255,255,255,255,241,219,190,184,173,108,58,47,41,33,26,27,29,27,30,33,26,24,36,71,133,184,150,113,106,70,55,52,55,64,
+72,78,76,77,79,79,84,104,143,186,167,118,106,109,121,114,77,52,37,34,33,31,31,31,31,34,44,44,49,51,55,57,62,78,134,139,95,94,114,136,154,163,165,157,163,208,233,242,
+248,246,248,248,253,252,241,246,245,204,175,173,177,212,214,197,122,144,185,214,206,201,247,255,255,254,254,247,226,205,220,234,239,231,243,252,234,194,201,234,242,247,245,241,229,221,173,132,
+88,88,102,112,104,98,77,50,20,16,21,23,22,14,10,10,15,20,19,13,8,10,19,22,31,48,77,101,94,75,104,147,153,125,150,153,90,49,58,73,85,86,86,68,44,40,38,38,
+44,54,48,34,19,6,3,10,44,79,106,101,90,86,63,71,114,139,135,144,176,201,182,170,185,172,155,162,214,234,234,226,232,235,240,240,247,255,255,255,255,254,255,255,255,255,236,232,
+234,213,211,220,234,254,253,255,255,255,255,255,255,255,255,255,255,254,240,215,204,200,200,173,167,184,182,186,220,246,255,255,255,253,235,214,200,199,205,156,76,40,37,31,16,17,23,15,
+22,30,24,27,34,47,104,126,78,42,30,30,29,41,62,82,100,86,82,79,77,79,88,104,142,201,187,129,107,108,133,157,132,76,43,33,34,42,44,43,41,38,42,41,44,68,101,87,
+78,134,164,130,94,98,130,147,156,187,196,197,207,233,249,250,253,248,246,247,248,254,239,229,221,208,179,157,130,133,140,139,105,123,158,189,173,210,255,255,255,254,249,239,229,233,238,231,
+207,213,229,235,225,182,189,215,227,235,231,231,235,231,210,185,164,161,156,161,150,119,73,35,23,28,26,27,28,23,19,19,30,33,16,13,15,16,20,24,30,31,55,93,82,62,85,144,
+149,114,150,107,45,42,51,70,76,71,73,63,38,23,19,23,40,59,44,17,10,7,13,31,65,106,139,135,108,95,73,71,114,161,161,158,191,218,203,177,192,180,149,140,179,221,229,218,
+196,197,234,238,227,243,255,255,255,253,253,255,255,252,221,228,221,214,221,219,234,250,252,255,255,255,255,255,255,255,255,254,252,241,219,220,222,222,217,196,198,205,182,154,187,245,255,255,
+255,252,231,211,208,208,208,178,111,69,47,23,16,16,17,14,20,26,28,29,38,66,76,70,55,22,22,26,45,94,136,162,146,98,85,77,72,73,85,97,114,151,146,127,113,113,141,183,
+189,116,68,38,41,64,69,64,54,51,58,54,57,101,161,139,126,193,204,165,148,146,167,185,197,205,208,222,245,254,254,255,253,249,248,238,235,228,231,210,187,185,171,144,111,106,108,105,
+88,104,153,165,151,217,255,253,252,240,246,246,227,226,247,239,198,196,199,211,184,186,206,208,206,210,180,178,203,215,213,207,208,194,167,157,146,123,87,56,41,34,24,29,36,34,28,34,
+56,49,27,20,23,24,19,22,27,37,48,55,56,48,64,139,158,147,154,71,41,45,51,64,58,54,59,58,40,16,14,27,73,93,42,19,22,27,41,72,94,125,172,163,119,83,71,68,
+83,134,165,183,183,198,212,198,175,173,150,128,154,199,228,197,160,180,193,217,215,224,252,255,241,238,254,255,255,252,238,241,215,218,231,243,253,253,254,255,255,255,255,255,255,255,255,255,
+249,235,219,238,242,233,210,194,206,197,190,182,208,252,254,254,254,247,228,215,208,211,208,178,144,109,56,17,19,20,21,21,26,28,33,37,44,73,82,77,72,54,51,61,77,118,160,162,
+130,84,70,61,65,69,77,91,97,111,119,109,115,121,139,176,173,148,108,64,62,71,86,82,62,56,71,84,92,115,192,240,232,235,233,220,199,193,204,203,207,217,228,245,254,255,255,255,
+252,242,238,220,215,224,219,186,171,199,176,141,109,90,86,88,90,95,135,155,154,180,224,242,233,224,252,242,210,211,238,252,229,198,193,222,183,191,199,189,200,206,172,176,210,224,222,220,
+212,189,184,178,169,143,108,77,52,40,30,26,26,27,24,33,41,35,36,33,31,36,31,29,31,45,54,51,47,49,55,100,150,133,100,54,43,42,44,49,45,44,48,48,37,28,23,76,
+108,66,34,29,41,59,78,113,122,128,163,163,144,97,75,62,63,88,129,198,205,183,189,187,157,148,173,153,157,193,213,179,180,185,168,198,214,211,224,234,231,240,255,255,255,254,252,252,
+247,247,253,255,252,248,250,255,255,255,255,255,255,255,255,255,254,246,245,245,229,214,199,196,196,182,172,200,245,252,254,254,252,241,222,213,205,213,210,204,193,108,56,34,23,27,29,29,
+35,35,38,54,49,87,113,75,73,75,102,129,133,142,158,146,118,70,48,37,58,69,72,80,83,83,86,85,100,119,126,142,149,147,119,102,97,97,102,93,70,65,75,92,121,136,176,253,
+255,248,218,220,210,214,219,219,219,233,246,255,255,255,255,255,253,228,204,182,185,204,219,185,183,204,165,120,111,83,82,93,87,90,129,204,199,192,208,234,235,252,252,203,182,215,246,253,
+254,247,250,246,208,201,204,199,217,219,205,218,222,205,208,232,222,210,206,196,155,123,119,107,59,37,27,26,20,23,24,30,33,33,40,61,70,70,64,44,37,45,55,48,38,38,34,36,
+58,44,33,48,54,37,34,40,47,56,50,44,48,58,64,112,109,73,58,56,73,101,111,147,154,122,119,137,136,119,85,73,78,87,137,221,212,192,189,192,175,165,197,184,175,187,203,205,
+187,167,180,207,217,208,200,205,228,252,255,255,255,255,255,245,246,252,255,255,252,245,250,248,250,253,255,255,255,255,255,255,255,250,249,236,207,189,190,210,211,187,184,207,248,250,255,254,
+248,232,214,207,206,207,207,198,197,123,43,52,38,36,38,35,35,43,59,79,78,69,56,44,49,62,125,146,148,157,164,156,129,75,52,42,56,64,69,70,68,64,66,73,83,105,112,121,
+156,134,114,118,105,105,106,92,83,77,87,126,171,190,229,255,255,235,199,210,211,217,220,222,229,245,255,255,255,255,255,255,247,214,183,170,160,185,215,196,193,184,121,101,102,78,86,93,
+93,118,149,186,194,206,203,240,255,255,227,184,208,225,241,252,252,253,249,249,232,220,215,199,203,232,225,219,211,194,205,222,229,231,227,219,153,135,154,142,80,38,27,23,17,17,29,34,
+28,31,50,82,107,104,93,69,47,42,48,44,34,19,24,20,22,29,33,51,57,36,33,52,65,63,49,50,69,94,132,132,97,76,68,76,98,128,146,165,156,127,111,127,132,130,93,84,
+114,165,179,182,146,144,179,196,185,176,204,204,200,194,196,207,190,179,206,225,227,224,204,208,227,254,255,255,255,255,255,243,242,245,249,255,253,243,228,228,240,242,250,255,255,255,255,255,
+255,254,249,221,184,196,213,222,210,190,198,196,233,252,254,253,246,227,212,217,208,205,211,203,200,165,94,92,78,61,52,49,43,47,79,105,90,58,44,43,38,41,65,108,141,165,154,98,
+66,61,57,51,56,57,62,65,62,57,59,65,72,90,111,146,167,135,134,104,80,83,86,79,82,91,151,218,249,243,250,255,255,246,212,213,219,224,235,247,253,254,255,255,255,255,255,250,
+231,203,178,173,167,184,200,214,198,160,106,104,112,86,82,79,111,111,148,193,176,175,178,220,239,215,157,155,183,238,241,248,248,246,217,200,210,210,204,183,199,215,198,185,200,213,201,197,
+208,224,224,220,170,116,132,127,62,28,26,22,24,22,21,35,43,52,69,83,105,109,109,80,49,40,45,55,51,35,27,38,62,66,63,83,65,42,76,100,97,72,55,45,83,160,160,151,
+115,80,68,76,99,135,180,164,137,106,100,116,105,80,72,75,128,146,130,143,167,121,144,175,177,169,184,196,205,220,217,217,226,189,203,213,199,201,186,197,218,249,255,245,226,226,236,233,
+235,232,229,233,241,233,228,238,252,248,249,255,255,255,255,255,255,255,246,217,207,225,228,225,201,185,206,224,239,248,250,247,240,221,207,206,203,204,211,206,201,194,189,155,122,127,97,73,
+54,59,105,118,73,52,50,43,43,43,31,72,115,137,76,40,52,63,57,55,52,54,55,57,56,55,57,59,64,77,104,143,176,158,161,94,63,69,80,87,104,128,207,255,255,255,255,253,
+254,248,232,219,221,232,250,255,255,255,254,255,255,255,249,228,207,184,163,154,151,165,193,213,157,116,105,119,115,107,93,94,147,140,144,178,151,146,160,171,163,185,207,198,204,249,249,241,
+232,205,168,133,151,165,178,192,205,214,194,155,194,224,212,197,193,194,197,203,161,113,125,112,56,28,21,19,35,34,22,38,69,85,86,84,112,129,118,71,51,38,34,55,50,50,95,140,
+136,112,85,84,90,116,162,154,127,83,82,71,104,163,162,176,177,136,86,82,95,120,172,148,153,120,72,88,77,57,47,51,84,109,118,106,148,147,129,130,143,156,165,168,198,215,204,212,
+228,211,185,171,137,141,130,144,175,211,228,196,141,160,186,215,229,214,217,227,234,227,241,254,255,255,255,255,255,255,255,255,255,255,254,246,240,238,239,232,211,197,224,238,236,246,246,241,
+233,210,201,201,199,204,210,208,210,207,212,191,170,186,144,111,82,87,105,100,79,71,61,55,49,45,45,47,65,58,21,29,48,59,56,50,45,44,49,50,48,48,51,55,58,73,92,132,
+172,169,142,88,64,58,75,118,171,225,246,255,255,255,254,253,249,218,224,217,215,234,253,255,255,255,253,241,240,242,233,204,184,161,149,146,148,165,196,196,148,101,97,108,115,136,142,129,
+189,163,146,154,133,132,164,150,161,213,253,255,255,253,242,225,213,149,115,115,123,142,170,193,192,183,142,115,170,206,210,214,205,177,160,172,139,111,121,99,55,35,23,27,48,34,27,45,
+75,95,80,101,111,122,113,88,59,31,28,62,50,79,180,203,164,123,95,79,98,146,171,168,139,88,98,112,129,146,150,175,198,162,133,108,88,122,167,155,170,144,101,88,70,65,43,49,
+70,94,127,112,112,144,158,118,114,122,121,109,155,182,173,208,231,203,154,132,102,97,90,99,112,140,163,150,111,105,137,184,180,182,205,220,222,220,247,250,249,252,255,255,255,255,255,255,
+255,255,255,254,253,250,245,236,226,215,225,238,246,248,246,243,229,207,197,191,192,203,210,215,215,222,215,203,218,190,155,141,122,113,92,105,122,91,87,85,64,57,51,37,42,36,22,30,
+42,47,48,41,37,36,38,37,40,43,44,48,52,68,93,118,128,133,121,82,58,61,78,120,171,232,245,248,255,255,255,247,234,196,213,218,201,226,250,255,255,255,240,206,192,206,217,203,
+171,150,150,150,144,154,207,224,178,134,115,115,153,164,200,198,206,183,144,134,127,132,164,185,165,217,254,238,192,179,143,134,127,104,108,119,108,126,136,156,160,116,88,88,120,183,207,214,
+196,158,140,136,122,113,127,90,58,48,40,56,68,50,63,99,123,105,99,128,130,134,125,95,52,35,44,62,68,88,146,182,160,153,121,87,134,170,193,214,163,113,143,143,157,151,154,167,
+167,180,183,137,122,147,169,161,164,141,118,102,78,69,62,56,72,98,119,120,126,143,139,113,93,88,86,73,109,139,156,200,210,164,109,83,82,80,70,77,73,77,93,95,82,78,97,105,
+106,136,167,198,219,219,235,242,248,249,254,254,255,254,252,254,255,255,255,255,255,254,247,239,231,222,204,206,229,242,229,224,204,180,172,179,176,196,208,229,231,232,222,225,227,184,182,190,
+183,135,93,100,109,86,86,87,80,70,55,40,31,29,23,29,40,38,37,29,26,27,29,27,31,37,41,44,45,58,87,107,99,107,111,82,59,65,88,120,126,153,189,218,239,245,225,214,
+226,172,183,212,203,211,240,252,253,245,229,211,207,212,220,212,183,161,149,169,178,165,214,246,222,172,157,142,179,197,219,228,246,245,214,194,150,150,179,210,221,243,255,201,149,140,134,144,
+128,95,111,99,104,106,105,149,141,92,75,91,139,196,212,192,135,92,120,140,115,113,134,113,68,59,64,90,85,86,116,165,167,125,127,168,184,160,147,95,68,68,65,50,52,125,170,183,
+191,194,171,177,212,201,199,205,194,165,163,137,141,140,127,147,146,185,203,187,186,191,183,183,176,147,116,91,70,63,71,65,61,71,82,91,102,108,105,90,78,72,77,78,97,118,147,179,
+186,133,80,65,66,57,51,59,57,50,48,52,56,73,93,93,88,105,136,158,206,219,213,226,225,233,250,253,249,247,245,243,253,252,254,254,254,254,253,245,235,219,160,171,225,246,222,206,
+183,155,132,146,172,197,203,229,241,240,240,240,240,235,235,225,220,175,122,104,88,69,63,65,77,58,40,29,28,24,21,23,27,28,21,15,12,15,20,22,27,34,38,45,47,50,68,86,
+95,104,111,84,73,70,84,102,132,156,204,210,190,200,200,217,229,212,208,224,221,186,192,232,236,235,225,224,222,212,185,183,173,148,140,176,221,214,219,238,215,206,194,175,219,249,247,243,
+242,242,210,168,162,136,106,143,235,248,235,169,149,147,168,169,180,154,125,99,111,105,120,139,150,133,105,147,192,206,203,177,130,98,135,154,128,118,107,113,91,69,70,104,100,115,119,170,
+189,169,163,204,164,126,112,105,114,94,65,43,82,208,239,235,250,240,239,255,226,187,179,186,196,176,199,180,120,84,98,153,139,184,201,205,211,207,187,153,165,148,111,80,49,44,48,47,
+48,55,57,64,76,80,84,80,65,54,61,68,77,97,132,161,189,132,93,70,42,36,47,44,43,48,41,41,47,73,122,123,111,122,126,132,172,183,133,141,125,101,149,235,242,236,235,227,
+233,241,247,250,253,254,253,243,240,228,180,196,231,222,205,182,169,149,133,149,184,203,201,236,246,249,250,252,253,253,250,246,240,190,141,114,77,56,49,43,42,36,34,31,29,27,26,26,
+22,16,12,3,0,1,9,14,20,26,33,41,48,51,56,69,85,84,82,77,86,92,94,90,126,167,191,210,193,180,197,220,232,235,227,222,228,175,135,150,165,214,228,225,191,156,156,176,
+169,151,128,162,215,228,220,236,204,234,241,234,249,255,255,253,247,225,169,137,155,143,94,121,189,168,144,113,128,177,200,189,186,153,102,94,112,123,164,161,182,193,179,160,168,179,171,168,
+164,161,180,163,132,140,140,170,158,134,135,128,91,82,92,154,212,212,206,179,136,105,102,112,105,82,61,48,151,246,246,255,255,255,250,250,242,235,231,213,196,187,196,161,126,136,177,156,
+151,194,192,192,204,203,160,108,129,114,82,62,47,41,27,27,30,33,36,47,68,69,63,69,62,44,44,49,59,77,115,136,148,130,98,58,31,24,29,33,37,41,40,38,51,85,157,168,
+119,130,132,130,149,105,64,86,72,44,50,133,218,212,220,210,211,200,208,236,245,250,252,246,235,233,219,213,221,187,170,167,168,167,155,169,192,207,227,247,252,253,255,255,255,255,254,249,
+213,155,130,100,68,55,49,49,40,31,37,40,34,27,29,28,19,10,3,0,0,0,0,5,10,16,24,33,38,44,50,58,61,65,62,64,91,105,115,92,99,137,161,175,191,165,183,212,
+234,239,218,201,252,213,93,83,102,187,224,191,123,97,113,157,204,200,156,168,168,184,204,200,207,239,247,254,254,255,255,253,255,233,184,196,190,184,160,160,148,108,83,84,122,186,183,178,
+154,97,83,94,111,120,175,186,200,213,185,139,146,162,172,161,149,143,158,148,148,165,183,194,186,187,201,192,136,128,132,141,225,225,189,184,177,140,119,104,88,106,129,126,238,255,253,255,
+255,255,253,253,243,207,192,191,210,187,168,168,179,179,163,107,137,186,187,158,180,182,146,114,90,68,57,54,44,36,23,17,15,15,23,34,58,50,45,56,58,44,33,38,56,88,125,123,
+100,85,62,35,23,22,24,31,40,37,34,37,50,68,115,191,146,123,136,149,121,49,45,61,48,34,42,73,173,207,208,206,179,148,163,217,236,239,246,242,221,184,155,192,204,163,156,144,
+128,154,164,196,205,214,247,253,253,255,255,255,255,255,255,250,199,137,101,80,71,64,61,61,49,38,41,44,59,43,31,26,15,8,0,0,0,0,0,0,2,13,20,26,30,35,41,45,
+47,45,51,61,86,86,86,79,84,109,142,160,179,172,184,191,212,233,220,199,245,225,98,82,116,185,206,183,146,118,122,144,171,176,164,162,170,179,199,191,175,200,234,249,254,255,255,254,
+255,250,234,227,205,183,165,142,130,99,78,97,127,146,161,160,112,79,71,82,97,107,167,193,186,186,186,173,187,192,187,153,134,146,160,171,187,190,196,191,183,193,206,212,212,229,221,227,
+252,247,227,238,226,194,135,98,125,214,239,241,250,253,254,255,255,254,254,255,238,144,149,172,212,227,219,218,198,168,108,85,137,150,150,104,123,168,155,115,72,57,48,43,37,33,23,19,
+14,17,29,30,38,34,35,45,54,44,31,40,77,118,118,98,72,66,45,28,26,27,28,33,38,36,34,41,48,58,80,160,163,150,137,156,116,30,24,36,33,23,29,44,90,175,203,167,
+87,79,122,200,235,238,240,235,221,186,141,169,167,133,136,122,128,146,155,210,222,224,238,253,255,255,255,255,255,255,255,253,197,109,85,83,79,76,77,69,59,50,50,51,66,43,23,15,
+8,5,0,0,0,0,0,0,0,6,12,17,24,30,35,36,36,36,43,58,75,72,65,62,70,87,113,144,151,147,140,143,175,220,226,208,242,250,147,121,139,136,168,187,162,161,167,161,
+155,150,136,149,170,185,180,187,207,228,246,255,255,255,255,255,252,246,225,217,182,146,127,127,128,102,86,94,94,113,139,122,72,66,64,65,76,118,165,176,178,176,215,200,187,189,175,142,
+155,177,177,204,205,207,203,165,158,190,231,241,250,248,254,255,255,255,252,249,248,248,219,179,208,255,254,255,250,253,255,255,255,255,255,253,240,182,197,226,224,241,233,233,205,136,116,151,
+156,115,136,129,115,132,115,87,72,57,42,37,35,30,20,15,13,16,20,17,23,27,37,41,40,44,52,62,118,127,92,78,63,56,45,35,34,33,33,34,35,34,36,42,58,102,135,135,
+135,120,112,135,98,27,17,16,17,20,24,34,48,102,151,120,56,52,73,125,199,231,234,231,236,215,171,171,161,133,142,118,118,105,132,190,214,225,235,254,255,255,255,255,255,255,255,241,
+150,91,84,83,83,77,73,69,63,62,54,45,43,28,20,13,5,0,0,0,1,0,0,0,0,3,6,12,19,26,30,30,29,33,45,71,78,73,71,65,68,82,101,130,119,94,99,107,
+147,167,155,182,242,250,190,203,229,210,175,172,155,148,154,140,136,127,116,130,185,238,236,233,239,255,255,255,255,255,255,255,221,183,180,201,179,160,129,116,120,119,113,102,104,122,116,93,
+65,51,61,58,79,123,165,193,215,233,221,189,184,173,130,137,187,218,213,215,199,201,200,165,167,226,252,247,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,255,255,
+255,255,255,254,254,234,212,234,238,232,231,226,212,197,199,215,179,157,163,154,143,105,76,75,70,54,40,36,31,23,17,13,14,10,3,6,22,37,49,42,48,69,85,108,127,106,84,71,
+63,61,56,42,37,35,35,36,38,40,40,52,70,116,179,139,127,164,155,122,79,47,36,36,34,34,35,31,36,49,58,51,47,48,57,80,143,193,183,178,211,196,162,180,157,128,128,104,
+102,106,119,183,196,197,238,255,255,255,255,255,255,255,255,227,143,93,85,83,75,72,66,64,57,61,48,36,31,24,16,12,5,0,0,0,0,0,0,0,0,1,2,6,15,22,24,24,
+28,38,54,83,91,82,72,70,69,78,104,128,101,88,100,93,153,135,119,168,224,210,217,253,255,246,182,157,147,107,100,112,120,105,118,148,225,255,252,254,253,255,255,255,255,255,255,255,
+203,142,127,167,218,199,156,144,139,161,162,134,118,101,70,57,50,45,57,61,95,136,194,219,221,232,204,186,206,157,149,183,162,199,221,208,226,217,221,224,236,255,254,254,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,250,246,243,233,228,221,229,215,213,212,196,163,153,163,162,114,88,87,88,62,37,30,22,28,30,15,
+14,7,1,17,45,51,43,40,48,77,129,153,132,88,68,59,58,57,52,47,40,38,38,41,43,47,54,65,107,156,200,173,173,183,160,129,102,99,107,105,83,61,45,37,36,36,31,35,
+41,45,55,83,126,123,123,134,144,149,170,157,128,116,114,108,111,113,132,187,196,211,239,254,255,255,255,255,255,255,253,220,154,106,93,94,84,79,72,69,55,45,43,34,33,27,20,15,
+6,2,0,0,0,0,0,0,0,0,0,6,15,20,21,23,31,45,59,87,94,86,69,72,69,77,112,140,141,112,91,88,118,115,111,146,180,154,172,229,255,240,225,206,134,98,106,127,
+129,107,120,179,234,254,255,255,255,255,255,255,255,255,255,253,224,140,122,149,198,207,180,197,179,160,162,139,108,93,73,51,43,51,65,90,126,148,176,179,169,170,191,210,238,189,179,160,
+146,190,217,226,250,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,246,228,213,219,218,201,214,211,
+192,176,165,170,150,132,118,84,70,51,44,26,35,57,33,19,12,5,17,65,83,73,51,57,54,95,161,146,134,105,76,57,58,54,49,50,43,40,38,41,43,44,54,73,146,204,221,213,
+203,146,147,175,146,149,149,125,83,58,40,33,35,33,24,24,29,38,48,78,134,130,118,118,119,132,156,177,155,123,137,142,112,111,127,182,217,233,242,254,255,255,255,255,255,255,252,226,
+178,153,105,106,104,90,71,65,54,44,38,35,38,31,28,21,12,5,2,0,0,0,0,0,0,0,0,3,13,17,19,24,34,45,64,95,107,76,70,79,80,95,115,146,173,137,90,76,
+79,80,78,92,113,127,168,176,215,219,196,182,127,105,113,140,169,173,197,241,228,247,255,255,255,255,255,255,255,255,255,255,241,136,128,160,201,210,203,189,158,129,140,128,104,86,90,69,
+48,55,71,92,115,137,137,150,148,148,184,171,187,200,156,136,161,208,217,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,254,253,246,227,217,221,217,214,221,217,198,203,200,183,153,140,111,58,40,34,48,95,112,82,34,27,17,10,29,72,94,93,63,79,86,104,135,136,132,121,88,62,
+56,50,48,51,48,41,37,40,42,41,44,68,134,208,224,208,205,173,157,200,194,160,157,114,54,43,34,24,30,26,21,20,24,29,42,68,126,129,115,115,122,114,121,162,170,135,167,165,
+109,112,129,180,220,243,254,255,255,255,255,255,255,254,247,228,201,196,137,115,105,75,54,51,51,48,45,38,40,38,33,22,14,10,7,2,0,0,0,0,0,0,0,5,10,16,19,22,
+31,54,78,120,107,52,69,85,90,116,122,128,156,150,107,78,72,68,64,78,99,115,129,126,162,214,162,177,148,109,116,153,199,219,249,255,249,253,255,255,255,255,255,255,255,255,255,255,
+217,136,135,158,224,228,210,154,135,154,163,135,90,90,95,85,55,52,61,73,78,99,119,113,134,165,165,130,104,176,164,140,151,192,196,238,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,213,191,205,200,210,222,217,217,214,208,185,155,105,65,40,28,24,50,154,149,82,62,55,
+31,37,69,107,155,122,65,98,130,144,132,116,114,100,80,68,52,45,50,54,48,44,41,37,40,38,40,55,104,172,203,197,187,187,162,179,205,180,148,86,45,38,33,30,34,29,23,24,
+27,29,42,66,116,126,111,107,102,94,99,121,127,164,203,161,107,105,141,173,210,249,255,255,255,255,255,255,255,255,252,229,205,204,139,78,72,51,47,49,51,52,47,42,41,41,31,19,
+16,17,14,9,7,2,0,0,0,0,1,7,13,16,19,22,26,50,86,143,75,41,57,71,83,93,119,142,143,165,143,98,78,72,69,77,95,116,121,120,180,229,150,140,132,123,146,178,
+214,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,200,164,151,168,240,225,192,146,118,146,158,116,79,84,88,82,57,48,54,62,62,71,83,78,121,153,119,94,83,134,160,133,
+116,157,182,215,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,254,255,255,253,184,153,192,197,194,178,193,
+219,225,196,161,128,79,43,31,29,37,77,129,157,118,115,98,80,147,172,187,210,169,125,148,132,137,128,111,94,80,73,66,55,47,48,51,49,47,43,41,41,41,42,69,107,143,198,208,
+156,130,126,148,173,206,184,133,86,54,41,43,44,40,34,30,28,31,44,65,93,116,106,95,100,82,79,129,128,177,177,163,151,119,119,140,180,249,255,255,255,255,255,255,255,255,227,191,
+196,191,137,79,64,52,52,51,55,64,55,47,47,43,23,17,21,29,27,20,10,7,2,0,3,7,7,9,14,17,23,22,20,42,95,136,69,42,49,61,76,86,137,183,171,165,123,115,
+109,84,66,75,90,127,157,133,183,207,133,143,153,171,192,204,190,234,250,255,255,255,255,254,255,255,255,255,255,255,255,255,233,201,183,185,192,160,132,132,125,109,100,66,64,63,59,59,
+45,40,49,48,49,48,45,56,80,87,73,65,69,98,121,101,108,147,184,207,234,232,242,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,254,235,218,249,255,246,186,157,192,210,205,171,168,211,213,173,133,111,72,41,34,38,59,164,198,189,199,190,186,212,208,173,158,176,193,167,163,139,113,91,77,80,69,66,63,
+52,48,48,50,50,50,45,43,42,43,42,64,133,179,191,203,155,125,108,140,176,196,207,197,123,71,57,57,70,54,37,26,26,31,44,58,79,98,105,104,94,86,90,112,143,154,155,194,
+175,130,112,125,191,248,254,255,255,255,255,255,254,236,165,155,184,189,162,99,71,59,68,77,83,99,72,56,48,31,17,22,29,35,30,20,22,26,12,6,8,9,9,13,14,20,20,17,
+23,37,111,125,75,45,49,61,75,102,176,208,190,186,180,162,151,123,87,76,80,119,142,118,148,179,127,143,172,198,199,215,176,205,243,255,255,255,255,254,255,255,255,255,255,255,255,255,
+255,234,193,196,158,130,149,151,111,72,52,44,43,35,31,33,30,34,38,44,48,36,38,57,70,75,77,72,78,93,90,78,104,163,207,214,191,200,226,254,255,255,255,255,255,255,255,254,
+254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,249,243,234,226,236,221,206,180,161,172,203,214,199,196,197,165,140,106,99,70,48,38,43,114,220,225,226,235,231,231,
+243,225,199,189,186,186,168,179,146,90,71,78,77,64,65,52,48,52,52,54,52,52,50,48,44,44,41,54,111,143,161,165,153,136,119,146,189,205,201,187,163,109,78,86,78,45,27,24,
+27,33,41,55,76,93,112,109,94,101,101,120,162,154,165,160,128,115,140,150,190,232,239,253,255,255,255,255,255,222,163,165,191,194,170,108,100,90,113,127,141,151,106,72,50,27,23,28,
+35,31,24,23,45,56,22,13,15,14,15,16,16,21,17,17,41,61,95,80,43,37,47,63,98,146,178,170,148,183,239,225,190,151,129,95,75,95,100,104,132,136,118,118,141,168,192,199,
+176,192,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,210,210,180,153,137,109,75,65,49,40,30,23,20,19,21,29,41,50,54,50,56,90,111,119,113,108,121,130,102,76,
+115,178,201,211,197,219,238,250,255,255,255,255,254,254,249,247,247,253,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,249,235,236,241,232,191,135,130,141,146,169,196,227,227,206,
+158,155,140,109,94,75,73,75,78,194,236,231,236,245,240,234,247,247,238,221,200,189,171,148,118,99,88,83,68,64,68,58,56,55,52,52,54,54,50,49,48,47,47,55,82,104,115,108,
+120,129,113,125,158,185,208,225,194,142,87,84,48,34,28,26,29,36,41,55,54,71,99,95,105,115,98,112,164,171,161,122,118,140,161,201,201,199,218,211,239,255,255,255,255,218,194,203,
+197,178,130,97,123,133,134,139,144,161,109,85,54,34,27,30,30,26,26,34,62,68,30,20,26,22,21,17,17,23,24,33,76,105,105,73,50,37,41,56,92,139,164,154,137,148,212,217,
+175,126,116,90,70,90,100,82,111,155,134,135,143,172,200,196,203,236,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,187,176,178,169,122,73,57,64,50,31,24,17,14,15,
+17,29,42,58,92,97,90,128,146,151,143,153,157,143,111,82,127,177,206,212,226,241,235,247,253,254,254,253,252,246,236,245,241,250,254,255,255,255,255,246,248,255,255,255,255,255,255,253,
+248,236,208,213,198,153,112,101,119,129,185,197,198,232,241,210,186,185,156,142,116,114,160,192,191,247,245,246,248,246,242,246,253,238,163,157,167,193,172,143,123,104,78,63,55,64,62,59,
+58,55,52,52,54,52,54,52,51,52,52,66,69,72,93,98,87,87,90,112,132,143,183,215,175,149,118,79,35,36,31,28,28,35,42,51,45,43,42,38,43,52,63,118,165,139,123,144,
+153,160,165,192,184,200,191,171,228,255,255,255,252,214,196,204,191,158,127,111,113,120,118,123,127,135,98,91,55,35,28,24,24,27,42,62,76,76,37,33,36,35,29,27,24,26,47,71,
+109,135,144,116,75,44,34,44,64,97,118,142,160,123,164,180,177,142,87,72,64,108,133,80,107,189,172,161,160,182,207,217,228,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,254,242,189,170,151,105,61,45,44,37,28,20,16,12,17,21,29,45,71,123,155,155,189,189,180,190,207,197,157,135,102,127,184,218,219,228,228,228,218,217,214,228,238,247,245,232,236,
+241,252,255,255,247,240,233,226,240,255,255,255,255,255,255,246,235,229,217,204,187,160,165,180,171,187,213,228,234,246,249,220,205,217,212,171,130,164,247,249,255,248,249,252,252,253,248,252,
+253,234,146,170,189,189,183,154,122,88,57,42,45,57,50,48,48,49,47,48,50,54,52,54,51,52,55,63,58,58,65,57,55,54,68,93,114,112,115,139,122,125,154,82,23,28,31,30,
+22,28,37,37,30,23,20,20,29,41,45,69,97,98,94,134,164,185,218,206,168,162,153,157,232,255,255,255,252,224,192,200,187,139,113,121,119,127,143,164,171,141,104,92,58,38,28,23,
+24,28,44,65,71,65,47,41,51,56,50,45,38,48,104,135,146,149,143,126,82,35,31,41,45,62,78,112,148,123,109,109,148,165,94,72,79,113,157,147,171,211,182,149,172,229,248,235,
+246,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,226,163,94,65,49,34,22,21,15,13,13,17,22,33,57,90,134,171,199,240,243,232,236,232,196,153,134,106,
+142,193,214,231,238,222,214,176,157,175,198,221,241,241,220,222,232,231,229,218,206,210,210,222,231,249,254,255,255,255,255,254,243,232,231,221,215,218,222,235,217,219,227,232,240,253,253,248,
+245,254,255,249,228,242,255,254,254,253,253,255,255,254,255,255,249,245,210,201,213,192,173,142,111,77,50,35,35,40,37,34,38,42,43,44,45,50,50,52,51,52,54,52,47,38,36,31,
+30,24,27,44,65,63,62,101,141,135,114,51,19,23,23,24,16,20,28,28,22,17,14,14,21,35,38,42,51,63,73,95,156,213,201,183,156,129,160,185,183,206,235,234,225,204,210,199,
+164,126,120,136,142,141,176,201,217,200,109,93,63,38,28,27,28,27,34,47,56,52,43,41,58,69,64,62,68,80,100,144,171,167,150,115,92,41,34,41,44,50,62,73,95,104,88,78,
+93,137,97,65,87,104,135,189,245,228,169,169,164,240,255,240,227,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,248,241,179,148,153,49,20,20,17,12,8,12,16,
+19,31,58,94,135,162,193,224,250,245,239,227,185,143,123,121,170,203,218,235,242,201,186,162,136,143,165,184,196,190,187,186,192,184,180,160,154,182,210,226,231,232,241,255,255,255,255,255,
+248,241,239,239,236,232,229,240,234,228,228,231,242,253,255,255,250,250,255,255,255,255,255,255,255,254,253,255,255,255,255,255,254,255,243,220,212,198,168,137,104,75,52,34,22,21,19,20,
+26,33,36,38,41,41,45,47,48,48,47,47,44,35,27,21,17,13,9,19,45,49,43,83,118,111,95,54,21,30,29,15,8,17,29,33,33,21,15,10,7,14,23,22,27,43,91,116,
+162,217,158,151,139,137,141,158,141,162,189,213,214,218,208,172,149,130,137,121,122,144,156,185,215,190,94,78,52,29,26,28,33,29,37,54,66,59,59,66,75,68,59,79,120,111,90,140,
+183,178,153,134,116,49,37,42,45,51,56,57,66,86,88,76,71,123,129,79,75,84,100,164,252,249,233,226,194,201,255,255,235,242,254,254,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,238,186,163,150,70,19,15,17,12,9,10,16,20,29,52,87,122,158,190,201,240,233,205,197,193,178,151,176,219,231,239,242,229,194,173,146,151,139,130,150,155,156,172,171,
+173,163,175,155,153,179,214,225,234,234,248,255,255,255,255,254,253,252,252,249,242,233,235,239,238,227,224,231,242,252,255,254,250,249,255,255,255,255,255,254,255,255,254,255,255,255,255,253,
+254,255,254,247,227,205,171,133,102,76,54,34,21,19,10,10,10,17,22,28,34,37,37,41,42,42,43,43,40,35,24,17,9,6,5,6,23,37,29,55,69,80,113,66,17,19,21,8,
+9,31,49,66,63,31,22,15,7,7,8,12,38,77,130,135,163,207,155,132,111,107,99,88,99,143,189,204,182,192,217,175,142,128,141,99,98,156,169,183,213,190,91,49,38,29,27,36,
+51,52,57,76,77,76,88,114,102,70,64,112,157,154,175,200,193,168,115,92,94,55,47,41,45,52,55,56,57,76,93,84,71,95,108,82,72,76,85,139,219,249,255,254,207,153,215,245,
+255,249,247,252,249,236,250,255,255,255,255,255,255,255,255,255,255,255,255,255,253,177,105,90,78,37,15,16,14,12,10,16,20,27,49,79,122,163,176,169,191,191,200,217,225,208,160,160,
+193,208,219,218,201,180,161,167,196,162,116,139,150,169,207,185,163,141,169,157,163,199,234,242,246,248,254,255,255,255,255,255,254,252,252,254,246,234,236,233,228,212,226,236,240,248,248,250,
+254,255,255,255,255,254,255,255,255,255,255,255,255,255,254,252,250,254,252,248,236,213,176,135,104,78,55,35,21,10,8,7,5,9,12,15,29,37,37,42,45,45,43,40,37,31,24,16,
+9,5,2,3,8,17,21,33,45,47,78,72,33,23,38,34,43,43,59,94,76,35,26,21,19,19,17,24,65,107,139,143,156,198,126,93,84,85,70,59,79,105,147,155,134,154,187,156,
+134,147,162,135,136,192,201,186,193,196,141,66,41,36,33,40,65,77,77,90,101,118,120,125,106,83,86,116,157,189,206,213,201,129,69,54,63,62,51,38,44,52,52,54,55,61,75,82,
+90,95,99,84,86,105,91,111,157,180,221,255,193,163,193,198,235,245,238,224,210,201,242,255,254,255,255,255,255,255,255,255,255,254,254,254,239,172,95,57,36,36,20,14,13,12,10,10,
+15,23,47,78,114,127,113,140,160,156,173,194,179,194,191,187,186,196,196,167,175,196,187,205,213,177,168,185,180,179,210,175,151,161,160,144,176,218,242,246,250,254,255,255,255,255,255,255,
+255,253,252,254,254,243,233,229,232,200,221,231,233,247,249,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,254,254,252,245,215,175,141,111,82,64,43,24,13,10,7,
+6,7,9,16,26,35,37,38,45,44,42,38,35,30,23,20,14,8,7,6,9,14,22,28,26,24,43,76,56,58,62,44,62,65,76,79,54,35,27,24,28,24,23,35,69,123,148,163,
+129,156,99,92,97,73,66,64,90,127,137,130,154,182,139,143,155,165,173,180,192,213,215,191,185,192,170,93,63,56,43,55,85,112,101,112,140,157,151,146,121,107,108,100,111,183,210,218,
+191,119,70,68,62,61,47,36,37,45,49,50,50,56,64,68,76,88,107,101,94,128,140,135,139,136,185,254,221,210,225,199,214,229,233,193,172,190,227,248,249,254,255,255,255,255,255,255,
+255,254,252,250,238,154,83,52,26,23,16,15,15,14,10,10,16,29,49,77,100,90,68,106,147,127,135,158,180,190,192,184,183,173,137,113,139,178,201,205,187,192,215,200,175,186,179,154,
+146,164,143,150,197,224,245,249,255,255,255,255,255,255,255,255,253,252,253,255,255,254,252,252,246,212,222,232,234,241,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+253,250,255,255,253,228,164,123,106,77,64,50,26,12,8,8,3,6,7,14,22,26,26,31,44,48,37,37,34,29,24,19,14,12,9,8,12,17,23,24,17,14,27,70,99,64,48,50,
+56,71,64,43,37,33,29,27,26,20,26,45,87,167,169,175,141,139,116,127,132,107,99,82,115,158,161,150,173,147,133,179,191,179,177,205,213,208,208,206,197,176,112,99,83,69,68,82,
+108,132,100,114,141,154,178,175,130,104,120,127,116,172,203,211,197,148,111,75,65,64,50,36,37,40,47,49,49,52,57,55,61,70,88,125,123,151,190,185,143,133,168,252,255,253,248,239,
+224,232,236,184,177,197,206,229,243,254,255,255,255,255,255,255,252,255,253,250,255,164,48,34,16,16,20,16,16,16,14,16,21,33,49,72,94,105,100,118,121,116,146,160,201,206,199,173,
+163,134,105,100,126,165,192,180,186,198,187,165,153,161,129,116,141,169,160,193,232,235,246,249,254,255,255,254,255,255,255,253,252,253,253,254,254,254,254,254,252,234,226,225,220,220,242,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,254,253,240,234,252,255,229,157,108,106,92,69,41,23,12,5,2,2,3,3,9,19,26,26,33,45,51,37,35,36,35,30,21,
+14,12,13,15,23,30,27,28,17,12,30,70,118,79,49,62,86,82,41,40,48,42,36,29,21,21,36,52,75,161,168,180,201,168,127,130,139,135,121,86,99,135,172,196,185,157,177,193,
+197,169,185,208,198,185,205,218,207,162,107,116,98,108,108,109,140,137,118,128,149,167,194,185,144,126,142,127,161,201,203,208,204,186,135,93,71,66,56,44,47,43,43,44,44,48,52,52,
+54,50,68,116,143,165,179,197,167,130,137,241,255,254,255,255,248,249,229,191,157,182,218,232,238,253,255,255,255,255,255,254,239,236,243,241,221,205,93,22,10,9,15,16,22,21,21,22,
+21,28,44,66,90,106,106,113,104,114,156,187,210,197,191,180,161,114,77,77,111,175,173,173,160,146,144,182,169,133,137,146,175,206,201,205,199,197,219,236,250,245,252,252,248,245,242,240,
+243,249,253,253,254,253,248,220,208,213,210,201,193,224,241,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,241,238,221,206,243,249,224,164,111,109,109,77,41,19,7,1,3,
+15,17,10,16,37,48,55,61,78,58,41,55,57,57,42,23,15,19,16,22,41,44,33,35,28,27,49,93,140,121,82,73,98,77,36,40,37,38,38,30,23,22,43,65,91,149,144,148,
+212,158,142,149,160,136,100,73,71,82,95,183,238,207,187,192,193,155,176,196,142,127,170,185,184,148,122,126,113,125,111,135,163,156,114,104,141,192,198,180,167,153,136,118,156,186,196,179,
+177,172,169,143,84,79,76,65,59,45,40,35,37,47,55,55,50,45,62,92,112,149,175,186,169,142,134,228,252,255,255,255,252,225,201,186,143,150,204,243,234,236,252,254,255,255,255,255,
+182,144,207,234,178,191,134,43,33,14,9,16,30,35,29,24,23,29,48,70,85,95,106,120,132,158,180,200,204,190,185,178,149,100,73,66,80,122,114,129,129,143,133,163,177,144,157,157,
+163,194,197,172,146,165,190,220,220,198,218,225,214,194,232,243,242,247,255,255,254,250,235,200,176,184,203,203,203,224,239,249,255,255,255,255,255,255,255,255,255,255,255,255,255,250,234,219,
+214,229,236,222,180,162,143,107,100,107,92,62,26,12,2,9,30,15,24,86,111,98,95,72,83,91,114,122,90,63,37,27,21,27,24,24,33,37,50,59,52,57,82,130,176,162,92,52,
+52,58,51,35,29,28,28,23,21,23,42,59,87,111,105,147,190,155,201,203,173,120,77,63,62,91,126,171,211,189,192,204,179,148,167,151,95,93,113,146,168,149,116,107,112,151,167,170,
+155,146,97,78,108,176,199,183,182,200,194,170,142,141,154,150,155,171,192,170,116,100,99,80,47,35,34,33,36,43,48,48,47,41,48,62,64,92,130,176,176,114,121,208,242,255,255,254,
+232,193,179,172,151,113,162,238,229,220,253,255,255,255,255,236,201,155,194,225,161,184,160,83,85,50,19,24,51,61,47,30,26,31,49,70,79,92,122,139,171,196,201,205,182,169,176,177,
+143,100,85,73,61,70,91,111,112,97,104,118,144,150,126,139,139,160,163,201,179,180,167,179,164,142,171,193,185,199,239,254,255,255,253,249,246,243,225,211,213,201,193,200,212,207,215,218,
+235,252,255,255,254,249,255,255,255,255,255,255,255,250,225,192,208,222,201,153,106,83,83,85,93,100,99,80,43,26,8,22,48,29,52,101,139,118,87,61,65,101,140,129,90,58,43,34,
+20,20,22,21,35,62,77,71,64,82,107,162,196,149,55,35,34,50,50,34,37,24,17,15,14,16,24,27,48,68,69,122,165,177,229,221,161,106,79,68,69,119,165,184,193,205,222,217,
+189,190,183,111,72,76,128,187,176,144,136,129,133,191,190,172,165,147,100,70,75,142,203,205,201,212,217,151,101,128,176,156,149,167,164,164,142,127,90,54,29,28,29,30,34,36,40,40,
+41,42,41,44,51,57,69,125,137,86,92,134,206,250,254,253,201,197,197,182,171,120,125,203,240,248,255,255,255,254,252,218,228,178,193,210,172,199,198,119,98,71,44,42,72,87,68,41,
+27,35,47,59,71,120,157,171,198,191,201,199,155,139,173,180,143,108,92,79,62,56,86,93,95,84,87,105,116,115,120,142,146,172,182,226,196,163,165,163,146,129,156,187,198,198,242,255,
+236,218,201,194,211,224,218,217,218,194,180,180,200,187,177,187,219,238,248,248,238,240,255,255,255,255,255,253,227,199,185,177,186,169,119,95,78,61,90,129,114,94,95,100,62,33,28,41,
+52,50,47,42,82,109,99,63,58,70,83,88,68,43,44,30,15,9,10,14,30,69,91,87,76,80,104,141,175,144,52,47,45,48,47,34,33,20,13,8,8,3,1,1,8,17,40,83,
+140,211,229,204,137,113,85,61,83,153,168,151,176,233,233,177,189,214,194,129,80,91,156,206,197,183,184,176,164,200,198,165,140,126,98,70,75,123,197,198,198,214,204,134,142,186,177,107,
+146,156,144,155,156,118,62,34,27,28,29,30,31,34,41,43,49,45,37,37,36,38,45,63,93,82,87,100,149,208,253,249,193,193,214,218,205,119,95,154,227,255,255,255,253,252,247,236,
+227,215,212,196,194,191,148,107,88,65,57,54,66,64,63,52,36,38,44,51,83,114,164,189,196,203,204,210,198,191,199,177,147,114,87,75,61,49,61,73,91,93,95,112,105,114,132,132,
+139,212,245,240,219,217,234,220,194,156,172,199,218,235,250,254,217,187,194,215,228,225,218,215,205,203,200,187,194,165,150,168,191,215,232,226,210,198,241,255,255,255,255,250,226,189,162,171,
+163,139,122,140,164,118,135,148,140,130,141,129,76,61,64,51,29,19,14,16,27,69,70,49,49,52,61,61,35,28,26,15,9,7,8,12,28,61,85,82,68,66,78,113,122,141,91,58,
+55,49,41,41,30,17,7,1,0,0,0,0,0,8,40,63,122,201,226,191,128,106,70,56,78,123,141,156,178,225,214,179,187,199,177,136,127,141,163,175,177,171,177,167,170,180,191,171,
+98,91,122,114,128,127,179,206,201,225,205,161,184,184,140,104,149,161,142,147,139,87,66,61,43,34,34,28,33,37,49,54,68,75,49,35,37,44,50,58,70,64,76,83,107,193,245,238,
+214,197,217,210,163,94,83,134,213,248,253,254,247,246,245,240,243,229,193,190,177,163,93,63,58,44,51,55,42,37,44,43,36,41,45,65,91,94,143,189,201,242,243,250,250,240,213,173,
+147,113,82,62,48,41,45,57,77,83,97,109,113,127,126,109,141,231,255,255,214,169,187,191,171,148,125,129,187,247,250,234,211,219,227,236,227,219,208,206,200,210,191,172,155,163,147,147,
+186,213,218,213,205,185,203,231,254,255,254,249,246,205,161,161,172,167,170,180,218,184,165,160,150,162,158,130,113,111,82,47,17,6,1,2,5,16,28,36,64,49,48,69,45,24,20,15,
+9,13,12,14,35,59,51,44,55,43,45,82,77,86,52,27,37,40,50,52,31,14,2,0,0,0,0,0,0,0,13,38,84,130,161,185,147,98,64,52,61,86,127,165,190,221,193,175,
+192,179,141,115,134,133,147,136,144,176,175,163,178,163,162,141,109,102,134,135,153,150,190,220,226,233,221,224,211,187,141,148,153,161,125,88,77,78,65,86,86,61,43,31,30,43,58,66,
+95,114,91,64,58,59,69,71,80,79,71,78,112,191,221,192,164,162,196,189,161,134,97,135,183,194,194,219,231,232,236,235,236,224,176,200,203,165,133,85,73,43,40,42,37,42,47,41,
+34,40,48,61,71,94,151,187,222,255,255,255,255,255,228,178,141,107,77,56,43,38,40,52,72,90,100,104,112,116,104,92,122,203,252,228,173,125,115,127,125,106,91,109,170,214,204,178,
+165,201,222,224,215,194,163,139,153,162,151,160,157,190,191,179,167,180,187,191,203,197,178,212,254,255,254,250,247,234,218,212,208,192,170,182,213,214,197,165,163,170,155,140,127,97,59,29,
+7,2,0,0,0,5,22,35,45,31,35,51,36,21,17,15,13,16,22,26,42,48,31,40,41,14,12,26,24,0,0,5,21,31,45,52,27,3,0,0,0,0,0,0,0,0,5,24,
+87,119,101,99,93,77,52,45,58,91,125,144,179,193,162,162,160,153,120,88,83,104,121,139,172,205,198,182,180,148,120,142,148,118,111,135,156,178,211,226,225,228,231,235,220,172,179,194,
+147,149,112,78,68,95,97,91,95,86,62,38,33,49,77,102,129,149,142,127,127,100,94,83,73,78,88,98,133,183,207,198,182,168,151,150,163,163,128,120,153,156,168,201,221,220,232,234,
+238,222,178,170,186,144,147,115,76,44,45,37,40,52,51,50,54,43,42,56,72,107,160,180,231,255,255,255,255,255,236,190,149,115,84,63,57,49,50,57,78,105,107,99,104,98,91,99,
+146,190,215,167,160,116,105,140,134,99,113,154,185,176,171,162,144,164,201,194,196,155,106,93,105,127,142,180,184,206,211,178,141,160,175,186,191,182,171,235,255,255,255,253,249,245,243,248,
+245,212,189,207,210,213,187,180,213,199,173,140,97,51,30,17,6,0,0,0,5,3,12,35,27,28,21,17,19,16,17,16,14,13,22,30,36,27,22,30,14,0,0,0,0,0,0,0,
+1,15,23,36,28,0,0,0,0,0,0,0,0,0,7,29,57,68,83,92,82,59,42,37,54,76,100,132,146,128,107,100,78,78,73,73,80,86,95,133,189,214,199,178,168,165,161,162,
+165,132,119,146,153,165,203,227,227,235,234,235,224,176,199,198,175,129,82,79,68,111,135,116,116,106,77,47,37,48,83,115,135,179,207,175,169,178,169,130,99,92,106,122,125,156,196,189,
+178,180,155,139,151,149,130,136,153,171,183,211,226,225,227,231,212,206,189,139,133,150,163,135,107,83,70,49,38,45,52,68,75,55,43,64,83,101,143,167,218,255,255,255,255,255,243,210,
+177,141,102,83,75,66,61,61,68,85,93,90,111,164,211,224,250,249,208,144,109,92,90,108,108,94,94,132,154,148,160,173,168,165,169,180,171,128,90,69,88,114,135,182,199,193,192,187,
+184,194,201,193,180,175,189,231,252,254,249,247,253,250,243,242,249,239,214,201,210,233,204,229,247,228,196,135,77,44,28,14,5,0,0,0,0,0,9,20,19,30,23,14,14,15,16,16,
+15,12,14,16,17,12,12,13,0,0,0,0,0,0,0,0,0,1,10,29,31,9,1,0,0,0,0,0,0,0,5,17,22,37,78,79,61,50,41,38,50,64,72,101,114,80,50,43,
+51,63,70,78,75,72,83,114,194,228,211,182,176,210,196,169,163,139,182,207,213,218,233,239,238,239,235,241,231,199,190,179,167,104,84,87,90,118,153,178,193,149,98,55,42,55,80,114,
+154,178,219,201,180,194,184,148,122,144,140,150,141,141,167,175,165,180,176,183,162,123,121,156,153,165,156,190,220,222,234,219,153,179,187,147,101,153,161,149,162,160,99,64,40,45,59,65,
+61,47,43,61,70,88,129,156,191,250,253,255,255,254,253,236,210,163,118,111,120,97,68,62,66,80,90,92,118,176,249,246,239,239,220,171,91,72,65,69,65,69,84,104,126,140,144,146,
+143,146,143,148,123,83,71,71,97,102,136,176,191,184,190,222,204,198,194,178,167,203,213,222,243,250,247,253,253,232,239,250,253,255,252,246,250,255,252,250,245,228,204,158,99,57,36,16,
+8,3,0,0,1,17,52,47,26,36,24,15,14,13,15,17,16,13,9,5,9,20,23,15,0,0,9,2,0,0,0,0,0,2,17,33,38,21,7,7,2,0,0,0,3,3,8,12,
+10,26,45,45,44,42,35,40,50,62,65,76,71,44,29,30,37,45,55,70,66,84,88,111,191,249,246,228,215,225,224,193,162,167,197,228,253,255,255,252,250,248,241,224,206,210,200,197,
+206,178,134,129,122,155,219,232,189,127,102,59,43,71,130,141,143,168,226,220,180,190,206,190,146,116,132,162,186,192,180,184,176,177,193,203,184,125,118,134,123,137,143,191,205,198,221,206,
+134,125,173,185,114,141,162,156,163,163,141,83,58,59,58,52,45,29,33,41,45,66,105,157,187,204,207,229,254,254,252,235,215,189,154,141,179,140,72,63,88,143,168,111,93,113,123,160,
+185,171,158,134,77,59,59,58,63,93,120,116,105,111,122,121,126,136,142,123,106,75,73,99,108,107,144,193,211,226,240,222,197,199,180,146,178,232,242,240,243,250,254,255,242,231,249,255,
+255,255,255,255,255,255,255,253,249,234,198,179,139,79,42,24,17,10,5,3,8,38,45,62,62,35,20,14,14,14,15,15,14,13,8,13,24,48,56,37,19,13,40,33,0,0,0,0,
+0,6,22,35,38,24,14,14,8,5,5,3,6,8,15,17,14,14,21,27,30,31,30,34,40,50,55,55,49,38,36,37,41,49,77,107,88,90,102,156,212,249,250,201,207,219,220,224,
+198,206,214,235,255,255,255,255,255,250,235,229,176,196,217,172,199,200,135,129,139,154,200,227,211,144,101,71,48,69,142,168,160,179,229,236,190,193,214,194,126,80,86,153,207,191,175,178,
+171,161,205,201,173,162,151,120,93,94,144,207,205,203,213,205,160,100,120,164,164,158,175,183,179,156,150,146,118,66,43,42,40,27,27,33,38,56,97,154,184,164,185,221,248,255,240,212,
+190,179,183,198,221,162,95,93,157,165,154,107,98,113,112,141,173,122,108,98,71,52,56,55,78,134,154,129,125,129,155,140,126,121,99,86,82,63,76,90,91,119,170,217,227,239,241,211,
+199,214,167,177,200,199,233,239,239,254,255,255,249,253,255,255,255,255,255,255,255,255,255,253,248,226,205,212,187,120,57,31,17,9,5,1,3,8,20,36,48,34,16,15,16,15,15,14,
+14,13,20,42,70,106,109,84,55,28,51,44,7,0,0,3,3,14,21,42,59,43,20,16,12,12,2,1,3,7,17,26,21,14,13,15,19,20,22,28,35,48,47,44,42,38,43,54,
+64,80,142,148,88,99,142,199,245,252,246,205,205,201,193,193,198,221,238,240,241,255,255,255,255,254,222,191,149,200,232,180,198,183,137,136,156,176,169,227,222,155,90,59,50,54,104,155,
+183,193,197,217,221,190,185,184,121,82,83,120,177,177,143,127,120,130,187,194,184,172,157,119,93,101,162,206,203,193,206,218,156,144,146,157,151,162,183,208,185,129,123,153,169,128,56,36,
+30,23,27,29,35,56,95,137,158,177,208,217,241,247,236,210,175,136,151,186,228,236,212,227,231,153,143,121,143,161,184,167,130,111,132,109,77,58,62,84,128,173,169,178,186,164,168,151,
+125,95,71,58,52,54,73,76,91,126,160,182,187,184,196,213,229,236,190,184,169,185,220,233,245,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,247,238,238,228,175,128,80,44,
+19,8,3,1,2,5,13,13,16,21,16,21,31,26,23,22,20,29,87,126,137,142,133,113,50,27,56,70,41,16,10,17,28,35,42,61,71,45,21,22,23,14,9,5,3,5,19,31,
+31,22,17,15,15,14,17,23,33,38,41,41,37,48,68,72,108,149,183,179,126,123,211,229,248,252,253,228,194,185,179,171,173,221,250,233,224,253,255,255,255,255,245,198,169,219,236,199,
+213,183,144,133,150,190,146,182,182,167,114,68,47,47,75,109,170,222,196,191,201,185,149,170,170,111,101,121,149,168,151,121,115,118,149,158,169,163,157,111,95,126,187,198,176,168,175,167,
+111,153,187,196,191,194,193,182,155,113,116,120,125,141,80,42,29,26,24,30,37,48,84,133,155,178,194,204,226,231,211,197,167,130,112,127,228,255,255,255,252,239,221,211,204,183,182,142,
+92,114,160,122,79,68,78,125,182,220,211,198,179,167,176,151,122,87,68,55,45,45,51,75,80,100,130,140,167,167,184,208,204,204,197,165,161,196,226,231,250,255,255,255,255,255,255,255,
+255,255,255,255,255,255,254,253,247,240,233,220,198,153,100,66,35,12,15,13,10,12,12,7,15,22,22,28,35,36,30,23,23,64,146,155,151,144,123,100,68,70,83,88,66,24,19,31,
+44,41,61,76,65,37,23,29,36,26,16,9,6,7,19,37,40,29,22,16,13,12,13,21,31,36,37,37,38,57,97,125,160,176,186,167,141,129,224,240,247,250,253,249,233,207,182,139,
+176,229,245,236,246,254,255,255,255,255,254,246,250,249,247,239,213,146,165,160,161,220,160,122,128,139,122,92,63,64,84,106,191,231,205,193,197,198,165,184,203,158,140,184,199,192,150,121,
+132,116,129,116,133,165,162,127,120,151,191,197,176,143,123,129,128,148,187,192,204,207,193,158,113,98,109,99,65,71,58,37,24,22,29,38,41,44,80,143,191,192,196,221,185,157,155,180,
+160,134,132,147,232,250,255,255,248,243,239,186,191,180,126,80,78,104,105,94,80,86,114,146,197,243,233,200,163,184,187,161,130,102,78,66,44,41,44,65,68,72,105,127,143,167,184,173,
+154,135,191,168,161,176,207,213,252,255,255,255,255,255,255,255,255,255,255,255,255,255,254,250,248,242,228,217,213,177,97,66,69,56,37,20,19,22,16,10,16,34,42,44,38,37,31,21,
+51,118,153,148,137,140,116,106,102,104,102,94,70,38,34,51,63,57,76,77,50,30,21,28,41,42,30,13,8,6,17,40,42,30,17,13,8,7,9,19,27,34,35,38,45,66,119,140,
+164,184,199,165,130,140,243,249,240,240,245,235,246,231,173,150,189,227,229,239,254,255,255,255,255,255,254,253,254,252,249,254,177,116,180,177,189,186,156,115,118,126,122,108,72,95,143,183,
+189,178,148,171,196,203,177,187,212,208,199,207,217,208,167,104,115,101,107,109,107,130,136,114,116,134,155,187,170,119,106,135,116,97,154,190,210,198,155,135,111,104,115,97,69,52,40,37,
+35,37,43,52,51,58,101,156,208,234,219,225,191,148,150,160,126,111,134,157,182,171,215,241,254,248,254,203,165,147,101,79,78,94,97,91,94,119,168,175,214,246,227,198,194,211,201,167,
+130,135,150,105,45,45,45,45,65,58,75,90,93,141,154,118,98,112,158,165,133,135,173,194,239,255,255,255,255,255,255,255,255,255,255,255,255,255,253,249,246,243,234,217,205,193,167,132,
+122,104,52,22,20,26,20,12,28,44,56,52,38,33,28,30,108,149,156,149,134,139,125,133,104,94,102,90,76,66,69,95,101,88,86,64,45,29,17,22,50,63,40,15,7,5,13,34,
+37,27,13,7,6,5,9,15,24,35,40,50,66,88,118,114,147,185,175,140,134,178,253,250,236,222,212,211,225,232,175,169,201,217,234,245,255,255,255,255,255,255,255,255,253,252,250,235,
+176,150,179,175,179,133,129,97,107,108,78,73,64,105,154,151,147,178,165,136,177,187,180,179,203,212,212,211,203,192,180,129,105,85,71,65,77,99,120,82,80,98,118,161,154,115,94,112,
+99,114,175,201,217,201,144,113,122,128,134,119,91,61,54,65,65,64,65,77,84,98,135,170,208,222,217,210,187,165,151,128,104,84,90,101,111,133,165,229,255,255,255,236,172,147,125,111,
+84,76,78,107,134,155,183,203,219,205,176,162,205,229,198,140,167,197,182,116,51,51,54,35,49,47,44,51,56,86,93,72,57,77,108,116,95,107,136,178,213,242,241,252,255,255,255,255,
+255,255,255,255,255,254,252,250,245,243,232,215,211,207,210,204,193,130,101,49,38,76,56,44,66,58,58,48,27,27,34,69,114,141,162,155,132,132,126,136,115,129,122,98,57,58,56,88,
+115,91,71,43,22,13,9,24,52,55,33,10,5,1,7,24,28,20,9,2,2,3,10,15,24,40,54,70,83,101,93,90,126,123,126,143,142,190,255,204,183,208,179,211,228,231,196,178,
+201,236,252,252,255,255,255,255,255,255,255,255,253,254,254,246,185,133,150,163,168,139,164,91,71,76,59,50,49,76,116,141,136,150,182,155,147,153,165,178,176,185,212,215,189,184,192,171,
+90,59,55,42,47,69,83,58,70,77,90,116,122,108,100,104,119,158,178,204,219,215,173,142,140,162,168,150,108,84,76,84,79,80,90,98,104,121,148,172,189,193,196,175,151,176,157,126,
+127,116,104,102,136,153,172,242,255,255,255,229,160,176,170,137,108,100,88,132,168,170,182,206,214,180,162,197,225,217,144,108,225,250,168,93,80,84,69,41,34,45,50,44,48,56,78,78,
+58,71,82,76,72,87,125,183,184,177,205,235,255,255,255,255,254,254,255,255,254,253,253,245,240,238,240,227,220,218,210,206,205,172,179,132,87,128,148,136,125,71,45,30,27,42,64,86,
+116,157,162,149,130,144,130,134,143,140,141,114,76,45,51,65,87,80,44,17,7,0,1,17,28,23,10,1,0,0,2,13,14,9,1,0,3,5,13,20,33,58,66,76,85,94,84,84,
+95,87,112,167,199,236,255,197,154,185,204,242,247,239,234,232,213,242,255,255,255,255,255,255,255,255,255,254,255,255,255,249,183,151,162,178,150,161,201,126,86,70,76,64,55,79,113,160,
+175,150,161,203,169,140,146,157,126,126,184,194,186,199,193,121,55,36,29,26,27,44,47,34,41,45,52,77,112,102,72,80,105,151,148,164,201,211,206,189,190,205,192,154,99,90,86,94,
+105,132,150,141,116,114,122,120,121,161,172,143,156,183,150,128,142,155,133,147,185,158,147,214,255,255,243,205,196,201,157,133,121,114,118,130,143,161,201,219,222,191,194,231,222,160,114,144,
+222,210,154,112,93,86,76,38,27,38,55,61,64,70,94,94,85,101,121,91,73,91,112,153,162,172,208,226,246,255,255,255,252,240,242,236,233,239,246,224,226,231,238,234,226,220,214,213,
+212,208,207,196,158,150,136,132,112,62,38,28,36,65,87,122,157,173,167,151,135,150,147,141,130,113,104,68,54,37,49,62,68,57,35,7,0,0,1,10,10,7,2,0,0,0,0,1,
+2,3,0,0,3,9,20,27,55,76,66,57,94,114,80,75,76,83,144,234,255,255,252,206,155,228,252,253,247,249,254,253,241,250,255,255,255,255,255,255,255,255,255,254,254,254,253,234,
+182,176,183,150,132,161,207,150,130,111,106,100,95,106,154,196,215,201,213,220,179,151,132,143,104,101,151,163,178,212,186,79,42,31,21,17,22,29,23,19,20,16,23,45,92,93,66,61,
+79,119,122,113,164,210,218,214,214,224,184,135,102,105,113,118,134,184,199,211,162,130,137,108,84,115,143,147,164,173,154,164,153,141,144,167,162,176,169,186,207,246,241,179,204,191,147,122,
+94,86,95,120,129,158,189,218,219,210,225,233,203,144,133,191,217,198,154,165,153,132,94,28,26,43,62,79,102,113,121,109,122,137,141,92,73,86,108,134,133,176,198,203,238,249,252,248,
+245,236,211,203,225,220,213,212,232,234,233,233,224,215,214,215,215,211,208,192,176,167,116,79,66,51,42,43,79,111,108,149,167,170,165,161,144,135,146,144,105,69,38,28,21,22,36,59,
+64,50,38,21,7,7,12,5,0,0,0,0,0,0,0,0,0,0,0,3,12,20,27,41,64,64,58,64,122,121,76,79,90,106,167,249,245,215,211,182,215,255,252,226,241,255,254,254,
+255,255,255,255,255,255,255,255,255,255,255,255,253,253,246,241,171,126,141,106,109,162,220,156,148,134,130,146,173,151,168,196,215,218,214,213,184,155,136,140,128,133,146,161,192,219,192,94,
+79,50,26,19,20,19,13,9,9,8,9,23,43,58,61,58,69,82,111,148,191,214,225,225,217,200,153,125,120,115,91,118,130,164,198,220,153,115,107,66,63,94,136,178,154,135,169,168,
+129,122,151,169,155,193,207,186,175,234,229,157,170,179,126,86,76,79,92,119,126,163,173,218,228,236,236,199,142,112,111,167,220,214,217,218,212,163,82,28,30,61,80,100,148,125,148,156,
+168,154,143,119,87,78,111,130,156,162,184,192,184,184,185,218,224,221,192,203,212,218,197,210,224,224,221,225,225,222,219,212,210,211,207,197,186,187,173,125,132,135,129,140,165,154,125,148,
+175,173,171,165,150,91,68,97,92,49,24,37,36,28,55,63,58,45,37,27,22,16,5,0,0,0,0,0,0,0,0,0,0,0,3,7,19,36,54,86,92,71,68,94,139,91,64,86,
+105,141,189,235,221,167,162,165,242,255,239,233,252,255,255,255,255,255,255,255,255,255,255,255,255,254,253,253,253,255,240,191,114,78,82,87,100,151,204,214,191,155,123,151,176,194,227,248,
+246,236,213,210,206,177,133,121,136,139,139,175,197,207,189,104,86,55,33,24,17,13,9,5,6,7,2,10,22,43,54,55,58,70,93,151,194,224,225,220,227,203,146,116,121,112,62,107,
+157,167,198,217,153,91,65,37,57,108,165,179,161,150,140,125,120,114,123,139,168,226,234,203,214,210,189,169,177,162,92,61,65,80,100,121,128,157,187,225,217,221,212,161,109,69,75,169,
+198,147,186,219,198,130,71,36,48,88,88,111,193,184,205,218,182,134,122,108,73,88,130,146,190,194,190,184,132,119,149,182,187,190,187,178,191,204,189,193,203,215,229,232,229,227,224,213,
+217,215,207,214,208,205,203,198,198,193,190,186,190,185,177,182,179,175,162,153,146,90,37,54,75,35,17,36,38,43,77,88,75,62,48,28,19,7,0,0,0,0,0,0,0,0,0,0,
+0,3,8,17,43,62,100,139,101,101,112,153,162,86,66,68,116,154,130,161,214,192,162,186,231,245,240,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,250,252,214,123,76,
+87,115,108,101,147,165,177,201,196,161,170,155,151,233,255,255,255,253,225,198,203,192,154,126,123,114,122,129,150,156,127,95,85,50,29,22,15,9,5,2,1,0,0,2,12,28,37,42,
+45,59,84,119,160,203,197,198,200,185,134,126,143,141,107,153,199,189,184,198,176,106,54,42,61,104,168,147,137,111,119,108,126,114,100,121,163,208,224,214,219,213,189,196,179,142,90,61,
+50,69,79,105,135,170,215,200,180,177,179,180,134,142,144,149,175,143,150,201,207,155,86,58,78,107,97,112,178,232,224,224,177,114,108,92,87,122,149,155,215,208,161,158,136,112,129,142,
+129,130,126,108,128,149,169,189,213,228,239,239,229,226,222,220,221,221,217,215,213,212,213,214,208,204,200,193,193,193,191,190,182,164,133,128,142,107,78,90,58,20,13,21,24,34,55,83,
+93,62,35,17,9,0,0,0,0,0,0,0,0,0,0,0,3,9,21,48,90,113,129,140,109,169,190,169,121,79,65,56,106,129,95,137,200,185,185,180,200,220,229,243,255,255,250,255,
+255,255,255,255,255,255,255,255,255,255,254,255,239,127,65,64,116,165,141,130,148,143,148,153,191,183,194,194,170,220,255,255,255,254,220,201,207,194,164,128,108,118,122,119,120,121,139,93,
+85,51,31,21,14,10,2,1,0,0,0,0,7,17,26,35,41,52,77,116,150,167,173,206,177,143,143,150,157,168,175,200,214,201,182,184,182,122,65,71,75,85,105,90,98,92,95,83,
+94,107,109,122,161,185,211,219,208,214,197,184,172,143,122,82,63,80,107,129,156,150,151,146,134,144,194,226,236,240,226,215,222,198,167,153,157,154,109,68,69,79,100,129,144,217,197,164,
+140,154,150,125,161,200,205,219,207,189,165,146,129,142,115,108,106,105,106,90,102,153,178,206,224,225,231,239,236,239,238,238,239,236,234,231,226,225,220,215,212,205,198,197,192,193,191,190,
+184,158,122,142,144,141,150,113,41,10,14,19,23,24,26,69,99,48,15,8,0,0,0,0,0,0,0,0,0,0,1,6,12,22,40,83,135,161,143,119,143,215,214,170,123,114,84,56,
+80,118,133,164,184,178,183,180,204,231,234,235,242,229,211,253,255,255,255,255,255,255,255,255,255,255,255,255,241,147,92,80,102,157,171,168,133,116,130,151,184,192,198,219,218,243,255,255,
+255,255,224,193,197,196,185,144,101,120,123,129,137,147,160,108,79,48,27,21,19,17,8,0,0,0,0,0,6,15,24,31,40,50,72,122,163,164,175,200,161,164,182,182,164,184,207,207,
+203,207,194,186,133,91,73,68,70,59,58,78,84,72,52,62,65,76,88,109,150,172,191,204,191,184,212,204,164,143,135,136,140,144,158,154,172,157,143,134,119,144,196,225,238,212,210,224,
+232,221,197,176,162,168,158,91,49,57,88,105,99,133,139,173,186,217,180,132,141,168,173,176,158,176,158,140,160,186,139,105,107,106,100,91,119,134,164,206,206,219,232,245,250,252,253,252,
+253,250,252,249,246,238,227,219,211,203,198,200,196,184,179,178,163,129,153,168,164,163,150,91,27,23,27,23,23,16,10,40,58,16,0,0,0,0,0,0,0,0,0,0,0,1,6,14,
+22,33,49,80,128,171,173,148,183,235,217,179,139,109,77,54,92,148,178,206,215,193,180,185,213,234,239,226,214,189,180,210,243,250,254,255,255,255,255,255,255,255,255,250,205,127,97,95,
+109,154,148,168,178,137,109,130,134,184,238,243,255,255,255,255,255,255,227,160,161,189,193,170,107,86,69,92,109,126,136,90,63,44,19,10,15,23,21,8,2,1,0,0,7,15,23,29,
+40,47,64,100,149,183,203,199,206,198,193,178,164,196,204,182,189,210,208,180,115,87,66,50,61,48,36,56,66,75,64,54,55,47,47,73,126,158,168,170,157,167,192,208,191,160,158,164,
+173,163,143,144,155,156,155,141,113,141,208,222,205,172,173,200,219,217,197,198,192,169,163,101,40,40,49,50,58,77,95,142,153,161,187,182,175,164,161,140,125,177,167,150,191,194,162,164,
+162,129,95,92,106,120,158,187,184,213,238,250,253,254,255,254,254,254,254,254,254,248,239,226,218,206,200,190,172,148,134,136,130,118,150,169,154,142,121,76,47,27,15,9,8,1,2,8,
+9,0,0,0,0,0,0,0,0,0,0,2,5,7,14,22,30,35,44,59,84,162,204,186,171,144,132,129,100,65,57,56,114,185,197,226,240,192,189,197,219,225,240,227,220,179,169,157,
+184,219,245,255,255,255,255,255,255,255,255,197,132,122,97,99,125,144,173,168,203,193,140,114,129,190,249,255,255,255,255,255,255,255,243,178,161,186,186,155,86,56,47,51,58,62,75,55,
+42,38,26,9,13,21,27,22,12,2,1,1,7,19,24,29,35,41,49,71,83,130,225,236,221,192,191,167,144,193,165,115,140,178,179,161,113,94,63,41,38,35,27,34,48,65,59,55,
+52,40,36,54,101,144,168,163,151,162,185,183,175,179,169,132,151,148,143,139,139,142,141,135,108,118,161,168,163,173,158,170,194,214,204,173,180,179,147,76,30,26,31,36,38,54,59,104,
+141,171,184,182,167,168,163,137,121,143,163,180,173,164,191,199,157,129,104,119,119,123,154,160,185,217,240,253,253,254,255,255,254,255,255,255,254,250,242,234,221,189,167,170,151,142,107,116,
+130,139,147,162,121,88,93,88,58,22,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,7,9,15,20,29,37,42,50,62,71,116,164,153,156,118,101,87,63,50,55,59,
+109,156,176,236,248,200,192,190,201,217,221,203,171,141,146,128,154,232,254,255,255,255,255,255,255,255,255,185,113,115,98,99,149,151,194,200,198,187,148,136,161,193,252,255,255,255,255,255,
+255,255,255,240,205,198,192,128,64,51,38,35,35,38,43,35,30,31,31,17,9,13,19,20,16,7,1,3,7,16,26,31,34,37,41,55,92,137,199,214,218,208,190,149,142,165,111,80,
+93,126,155,157,113,91,66,44,34,30,26,26,33,48,50,52,44,38,43,69,121,150,173,191,203,194,217,203,186,200,176,134,158,132,140,132,107,111,116,151,161,150,120,157,155,169,182,178,
+204,207,219,197,169,176,95,38,24,24,27,23,16,27,54,109,153,180,189,178,154,167,141,102,121,141,163,179,151,168,180,160,130,122,104,99,98,114,157,164,210,235,241,247,247,250,254,253,
+254,253,249,250,250,246,240,226,211,185,184,192,179,153,114,98,101,140,169,156,116,75,65,64,47,22,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,10,13,16,23,31,
+41,56,64,69,84,105,122,134,156,129,82,61,57,54,57,68,97,147,201,235,248,225,226,205,206,222,185,171,130,98,102,114,196,255,255,255,255,255,255,255,255,255,255,222,135,113,107,119,
+162,169,182,217,199,169,146,144,184,220,247,255,255,255,255,255,255,255,254,249,228,200,198,134,71,63,37,28,27,28,30,27,23,22,24,19,9,9,13,9,12,10,7,8,14,19,23,28,
+35,36,37,55,104,149,182,200,227,234,198,179,189,144,76,65,92,165,187,157,122,106,83,62,45,35,28,26,31,48,59,54,41,44,66,109,151,169,179,199,213,219,220,221,220,191,146,147,
+171,156,125,116,93,86,137,191,180,154,127,184,158,192,220,219,217,221,218,214,196,151,58,34,29,27,21,15,13,27,66,118,141,137,147,167,160,158,116,59,100,162,187,167,160,141,130,141,
+173,142,111,128,126,150,198,189,205,183,194,212,231,236,236,249,240,201,199,229,232,234,233,219,213,208,185,164,137,120,119,104,108,135,150,156,121,65,49,41,36,20,5,0,0,0,0,0,
+0,0,0,0,0,0,0,0,3,14,13,12,14,19,23,29,41,64,72,75,101,108,120,155,139,86,62,62,54,50,62,78,116,184,228,241,247,232,217,199,213,198,176,173,134,91,97,143,
+218,255,255,255,255,255,255,255,255,255,255,242,149,130,127,153,205,201,167,191,184,160,137,134,183,220,240,248,252,255,255,255,255,255,254,245,222,187,178,111,100,94,61,36,28,24,23,22,
+22,22,21,21,10,6,10,10,12,10,13,15,20,24,28,33,37,37,38,58,104,121,140,196,240,215,178,203,205,162,90,77,115,191,208,189,171,148,112,79,55,43,37,34,35,42,57,54,
+45,59,113,169,170,172,185,217,236,238,221,222,226,190,151,144,164,192,170,125,90,79,144,170,186,175,161,234,214,196,214,241,250,245,238,219,134,76,43,34,38,38,38,31,29,61,75,98,
+127,144,150,164,177,125,66,61,90,135,149,127,125,125,133,130,163,169,135,149,134,150,173,142,116,90,113,172,193,176,172,200,191,148,132,185,194,205,199,214,224,226,207,179,156,144,149,165,
+167,160,144,111,85,50,37,29,23,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,17,19,15,20,27,31,35,47,59,59,57,68,97,135,163,123,77,64,70,72,72,88,116,
+139,206,235,252,249,245,221,187,178,150,154,157,137,113,119,176,242,255,255,255,255,255,255,255,254,243,254,214,151,129,146,207,225,186,164,164,156,160,143,129,182,213,224,228,252,255,255,255,
+255,255,255,250,215,147,104,71,79,77,63,47,40,26,20,19,19,21,17,14,9,7,10,12,13,14,17,21,26,30,33,36,41,41,40,55,83,106,140,187,231,204,186,194,189,157,119,135,
+149,173,183,179,183,178,134,86,65,59,56,47,42,42,45,52,59,83,128,158,171,162,163,204,222,224,221,234,228,208,186,142,86,119,158,120,78,61,80,116,206,255,255,246,210,184,225,246,
+255,254,254,226,154,94,75,106,133,121,72,51,55,77,57,82,142,160,120,122,162,156,106,101,109,114,100,102,102,97,86,102,113,148,128,102,115,92,84,75,72,93,120,150,141,122,130,149,
+136,126,133,155,150,169,162,162,194,212,213,212,203,210,187,172,171,165,136,95,68,44,34,28,16,9,0,0,0,5,10,2,0,0,0,0,0,0,0,5,17,24,21,22,26,31,38,43,
+52,50,47,43,51,92,123,113,90,76,75,121,113,101,154,197,169,198,246,255,247,231,235,201,146,115,106,108,109,114,123,198,255,254,255,255,255,255,255,255,253,248,245,200,165,154,180,218,
+200,169,147,142,135,136,126,123,182,179,193,234,254,255,255,255,255,255,255,253,207,123,58,54,61,51,45,34,30,23,22,21,15,15,14,7,6,9,13,16,19,21,24,31,35,41,40,41,
+49,47,43,50,69,98,146,196,222,189,187,190,162,119,123,135,141,143,141,168,203,203,155,91,78,82,84,64,47,43,44,54,62,78,94,113,127,129,146,175,199,168,191,218,210,162,122,108,
+63,70,85,68,48,41,43,77,184,255,255,254,247,250,255,255,255,254,250,247,211,171,170,210,210,192,156,142,119,71,90,151,171,143,112,154,155,126,115,132,121,87,69,83,88,88,83,88,
+101,99,76,85,105,79,59,75,95,127,121,151,160,149,130,127,109,109,132,132,125,139,140,123,156,190,212,213,215,214,184,164,158,161,133,99,71,90,70,51,28,12,7,1,5,10,19,9,
+0,0,0,0,0,0,2,10,24,31,28,28,29,37,43,44,54,49,42,38,49,78,109,84,66,84,77,136,118,105,157,224,226,224,249,255,249,211,199,183,153,106,73,70,71,84,107,198,
+255,246,246,243,255,255,254,243,248,253,252,215,204,206,212,187,193,169,140,155,122,106,94,107,173,194,191,232,254,255,255,255,255,255,255,255,215,97,47,43,44,38,31,24,24,26,33,22,
+17,15,8,6,9,14,17,24,30,35,36,41,43,48,51,55,63,52,47,50,71,94,135,186,187,164,168,156,142,100,84,92,118,130,156,191,213,221,173,116,104,112,115,85,54,47,48,54,
+59,68,72,86,105,116,118,132,147,125,119,140,148,113,75,59,47,50,47,34,27,43,54,56,191,255,255,255,255,255,255,255,255,255,255,255,242,252,229,203,200,144,185,193,180,153,164,186,
+162,127,118,164,160,114,119,140,100,55,45,61,79,97,93,97,104,88,91,102,79,54,63,82,112,182,162,189,199,175,141,123,108,101,109,108,136,144,134,158,199,210,214,214,212,205,200,192,
+177,153,121,98,80,82,71,44,33,27,9,6,6,6,21,19,0,0,0,0,0,0,3,14,29,38,37,35,35,38,45,54,54,45,34,34,48,76,107,91,64,71,72,90,107,133,180,247,
+252,183,196,222,220,204,179,148,171,148,92,95,85,82,104,157,214,212,203,197,179,219,250,234,250,255,255,250,248,235,227,206,194,177,147,148,112,112,99,123,187,210,222,229,254,255,255,255,
+255,255,255,255,235,118,36,33,34,38,26,22,24,27,30,28,28,31,17,13,16,21,24,30,47,55,62,55,55,59,68,77,73,58,48,51,61,84,122,133,118,109,94,79,82,76,78,87,
+94,125,172,203,196,192,175,155,150,196,192,122,70,61,57,57,59,64,73,84,98,94,71,65,72,73,57,64,71,68,50,34,31,29,24,22,22,56,109,157,234,255,255,255,255,255,255,255,
+255,255,255,255,255,255,252,186,158,130,184,189,161,157,171,179,168,149,155,172,186,178,137,115,76,36,30,41,62,80,84,99,100,97,105,92,56,52,75,77,108,190,219,220,212,175,120,104,
+104,101,104,113,141,170,194,205,208,182,163,185,201,204,207,183,146,108,86,79,59,42,38,37,42,37,20,9,2,5,10,7,0,0,0,0,0,0,5,13,31,48,48,45,49,51,54,72,
+65,48,33,34,55,87,115,107,83,66,63,93,141,177,180,234,247,136,112,142,198,192,168,160,183,147,93,114,135,125,135,156,158,156,156,156,141,186,243,252,253,253,249,252,242,205,213,206,
+217,191,134,133,105,100,132,143,201,214,215,238,253,255,255,255,255,255,254,252,243,167,51,20,21,28,23,20,23,20,16,21,30,58,38,26,27,30,35,40,54,66,71,66,71,76,79,80,
+75,62,51,47,47,58,91,94,59,47,49,64,72,78,84,77,87,109,169,213,190,154,155,194,218,238,219,177,98,68,65,61,59,70,85,88,82,68,52,43,38,37,35,35,45,45,27,21,
+17,16,19,14,13,54,125,207,254,255,255,255,254,254,255,255,255,255,255,255,255,248,243,214,162,151,156,143,115,87,125,169,184,176,182,165,146,129,101,65,40,20,20,28,48,72,87,91,
+84,83,80,65,48,45,50,70,100,148,206,191,167,133,102,101,106,112,135,135,120,136,165,153,148,130,112,136,157,165,158,135,98,75,61,47,38,33,26,31,37,56,47,15,14,16,9,3,
+0,0,0,0,0,0,6,16,34,59,65,64,71,70,68,107,107,85,55,50,82,119,128,141,108,69,82,158,176,134,155,252,218,95,104,155,204,169,141,149,153,144,116,163,179,157,149,151,
+163,186,177,168,198,227,243,247,236,231,236,242,210,115,132,171,220,211,154,139,127,108,133,143,177,189,204,245,253,253,254,255,254,254,252,248,240,139,54,40,22,21,17,13,15,9,3,13,
+23,38,33,33,38,41,43,50,56,63,68,73,80,80,80,82,70,59,49,44,38,43,56,48,31,29,36,44,55,71,76,79,105,113,164,218,203,164,155,204,227,226,224,173,92,69,70,71,
+71,86,105,93,83,63,47,36,35,30,24,23,28,29,16,8,10,12,16,16,14,33,80,165,238,247,246,235,236,254,255,255,255,255,255,255,255,253,253,218,170,150,92,65,55,49,69,73,
+139,175,180,149,80,52,52,41,27,14,14,23,43,71,94,80,68,66,55,41,36,29,29,61,88,93,146,140,130,113,108,104,109,121,132,146,134,107,87,84,90,108,100,114,126,127,132,116,
+78,64,58,44,37,36,33,34,29,55,63,22,26,27,10,5,2,5,3,0,0,2,13,27,45,72,86,91,95,90,83,112,139,122,70,73,119,139,157,167,121,104,135,180,184,120,128,238,
+203,87,109,167,170,144,147,139,140,168,178,197,205,162,162,160,176,187,183,193,225,238,253,246,220,233,239,226,212,125,78,118,175,190,144,121,139,151,146,132,151,179,196,211,242,252,253,253,
+254,249,240,239,236,185,88,75,47,22,14,10,6,0,1,9,20,19,22,37,44,44,50,57,68,77,79,88,85,73,70,75,62,57,48,41,36,36,34,28,28,33,36,44,64,102,109,95,
+116,149,196,210,203,168,151,201,221,212,211,111,61,64,73,78,73,85,107,90,69,55,42,35,31,26,21,19,16,14,5,1,2,7,10,14,23,29,52,101,162,193,208,219,236,255,255,255,
+255,255,255,255,255,255,255,215,128,112,100,71,58,47,69,75,95,140,151,141,95,84,62,34,21,14,14,19,34,51,72,65,57,56,48,36,29,15,22,35,40,50,70,86,106,97,85,79,
+98,108,112,146,151,122,98,79,87,98,104,100,107,115,123,97,71,82,70,52,51,52,45,44,36,57,69,59,43,34,21,9,5,5,8,6,5,10,22,31,48,78,100,115,113,113,106,111,
+129,132,82,106,146,184,200,165,147,149,189,193,162,121,115,153,136,82,101,130,133,134,129,136,154,185,186,168,165,154,165,193,200,191,205,183,206,211,194,199,173,192,217,213,200,91,59,86,
+123,200,199,144,130,139,125,107,129,167,190,189,232,243,246,247,245,240,234,232,226,227,158,93,71,43,26,14,13,17,13,13,16,20,30,44,48,49,57,66,86,85,78,85,80,71,69,66,
+61,52,44,40,37,34,30,27,30,38,54,66,112,162,126,100,142,186,220,207,180,154,167,210,169,98,97,57,57,75,80,59,54,73,80,66,56,49,41,37,34,27,21,15,9,6,1,0,
+0,0,2,12,22,30,42,62,95,129,161,219,255,255,255,255,255,255,255,255,255,255,255,214,122,113,121,108,75,58,55,69,75,95,112,112,114,99,64,31,23,20,16,15,29,41,51,51,
+47,43,37,37,28,10,9,15,19,28,38,43,59,56,58,75,93,99,109,127,120,113,108,72,63,70,75,80,100,118,99,70,78,85,68,61,63,64,55,48,42,42,54,63,51,36,24,14,
+5,5,6,6,9,15,24,28,45,86,113,122,133,139,112,100,119,141,119,111,132,186,194,180,197,179,193,210,153,113,99,111,95,83,88,95,102,105,112,142,169,190,183,162,153,156,175,186,
+165,175,196,192,171,150,109,118,97,108,147,201,151,56,57,58,73,175,231,198,178,161,137,119,140,160,189,194,225,235,233,232,227,222,199,204,201,197,136,83,78,72,48,37,43,56,38,22,
+22,30,36,49,54,55,62,75,93,84,76,73,71,73,71,68,63,57,49,44,37,38,37,37,47,57,78,123,164,189,160,127,183,225,213,196,183,186,189,128,90,54,40,44,73,98,83,62,
+64,72,69,68,57,50,41,37,33,28,20,14,9,6,0,0,0,0,0,2,8,13,23,37,51,64,118,187,249,255,255,255,255,255,255,255,255,255,255,228,136,109,125,107,75,64,63,73,
+76,63,77,99,92,70,52,30,24,21,15,14,21,31,36,36,35,29,24,21,15,10,8,10,19,23,22,24,34,40,56,92,83,75,88,87,88,90,91,71,62,69,69,90,119,119,97,88,
+105,97,109,100,87,69,80,70,50,45,55,54,41,26,9,5,3,9,7,9,12,15,23,30,50,93,122,125,133,129,104,94,118,127,141,126,155,191,225,250,253,233,210,218,143,137,142,120,
+112,94,78,87,111,111,126,156,171,177,176,186,163,164,176,180,157,167,189,179,132,104,82,83,71,68,87,133,116,73,64,78,99,186,233,226,221,203,175,169,172,168,186,200,221,220,222,210,
+208,215,149,137,157,149,109,76,90,101,71,70,66,52,43,37,34,37,40,49,56,62,70,88,86,84,92,86,71,71,72,69,72,63,55,49,42,41,41,54,85,108,137,160,179,173,162,148,
+189,226,204,193,211,211,149,82,57,52,45,50,69,76,57,69,65,64,76,77,61,47,41,36,30,26,20,14,9,5,0,0,0,0,0,0,2,10,22,33,43,65,92,143,190,229,255,255,
+255,255,255,255,248,227,233,178,120,127,130,93,72,70,66,78,93,104,98,88,75,52,38,22,20,17,15,12,13,23,29,23,24,23,22,15,9,12,13,16,26,30,16,16,24,31,62,99,
+80,71,78,80,79,71,65,69,70,66,68,92,102,88,94,100,92,111,142,129,90,61,91,75,49,41,41,35,23,13,6,6,5,15,14,14,14,19,27,34,55,86,122,148,156,140,107,97,
+116,120,140,182,247,255,254,255,255,255,252,235,172,183,204,173,148,90,77,108,171,169,147,164,178,170,177,221,198,186,189,186,168,167,183,157,112,91,92,86,68,65,68,76,91,93,95,111,
+161,207,241,248,245,232,203,190,186,186,196,203,205,205,210,204,187,200,179,130,108,88,93,88,94,107,80,68,62,43,36,37,34,33,38,47,58,71,85,92,86,93,108,101,78,73,78,75,
+75,68,63,59,58,54,54,97,153,172,179,187,191,187,164,161,198,222,207,189,189,169,111,63,43,43,41,51,61,47,34,38,34,40,56,58,56,49,41,34,27,23,17,12,7,0,0,0,
+0,0,0,0,0,15,31,51,62,90,111,135,150,186,226,248,255,255,255,255,224,178,165,134,105,119,105,70,69,75,68,77,99,122,92,75,76,47,22,20,19,16,13,10,9,21,30,23,
+20,22,24,17,10,10,17,31,38,36,21,20,31,51,86,108,92,79,87,113,106,72,58,63,56,52,68,84,80,68,70,68,63,79,85,100,104,85,83,57,41,31,30,33,33,20,12,13,
+21,23,23,17,19,23,29,34,51,78,128,178,175,154,112,99,102,113,132,161,201,233,255,255,255,254,252,247,193,206,222,231,189,106,119,148,180,201,183,171,176,168,173,203,229,222,190,164,
+164,179,183,158,129,109,98,75,65,75,70,76,91,106,104,111,186,229,245,248,246,235,207,194,193,190,196,203,200,200,197,204,172,137,165,118,82,66,80,107,100,68,62,52,41,33,30,27,
+29,30,38,45,62,77,94,101,97,97,105,98,85,86,88,82,71,64,69,80,109,98,111,176,213,203,200,219,218,203,187,197,218,220,207,191,176,155,101,62,49,36,33,36,47,45,21,17,
+17,36,54,59,56,55,43,31,29,22,17,14,7,1,0,0,0,0,0,0,0,16,41,56,52,77,99,133,149,184,203,215,247,255,254,217,157,140,140,116,98,113,86,57,68,88,93,104,
+104,100,85,73,64,43,26,31,31,29,20,15,20,37,38,26,35,38,42,30,17,22,38,57,56,45,29,33,61,107,140,133,93,105,151,171,140,98,95,82,55,54,63,71,80,57,54,51,
+58,75,90,97,119,116,65,50,58,49,47,51,58,36,21,24,29,26,21,23,20,23,27,36,51,88,139,170,155,163,114,112,108,109,104,99,113,197,255,255,255,255,254,254,248,224,246,255,
+249,231,219,233,203,197,196,164,172,169,164,193,221,226,169,141,151,171,180,180,171,134,97,76,79,76,69,82,98,94,72,86,170,238,248,253,249,239,218,203,205,198,197,205,200,193,183,162,
+129,104,98,72,68,66,73,108,121,78,57,54,38,29,27,24,28,30,44,54,66,86,100,101,90,87,93,98,105,95,88,79,71,76,93,129,169,186,220,243,238,226,227,228,194,178,199,226,
+247,246,224,204,180,141,108,84,68,42,27,31,40,43,22,16,21,49,62,54,45,45,41,31,27,23,17,13,8,2,0,0,0,0,0,0,0,17,49,61,38,44,77,111,127,173,199,199,
+241,254,229,163,98,94,123,106,85,83,76,65,111,116,116,133,137,102,77,77,79,50,47,50,41,44,35,35,37,54,57,72,84,64,45,28,22,31,57,62,58,59,52,57,84,130,162,123,
+102,156,210,197,170,134,121,114,109,94,75,70,73,58,52,52,70,90,86,73,79,95,59,55,57,55,44,47,44,31,26,22,23,22,22,23,22,24,28,37,63,90,125,156,130,133,129,127,
+123,113,93,88,90,128,183,224,219,236,255,254,238,212,247,255,255,255,255,255,183,167,182,183,200,201,200,205,229,232,179,127,122,129,157,186,184,151,115,95,88,80,75,64,80,90,79,101,
+170,238,252,253,249,238,217,205,211,204,200,203,196,196,150,65,72,63,49,54,64,69,73,93,113,98,65,47,40,33,29,29,33,38,44,54,70,82,92,97,87,87,88,91,98,87,78,76,
+83,109,165,206,219,241,255,254,248,247,252,250,198,190,240,254,255,255,238,213,182,135,127,146,141,61,33,38,26,30,26,6,15,28,29,33,33,33,34,30,26,22,19,14,9,6,2,0,
+0,0,0,0,0,23,51,54,37,40,70,93,98,147,194,204,225,222,198,168,126,121,115,97,99,76,107,126,167,171,187,186,184,139,97,86,69,51,61,61,44,49,50,56,63,62,61,78,
+79,58,38,28,22,23,36,41,48,61,66,99,123,140,144,126,143,204,229,213,169,139,151,172,139,97,78,63,58,63,44,45,56,57,55,51,49,57,61,50,36,35,34,38,35,28,29,28,
+27,27,26,24,27,33,35,47,75,90,108,146,134,120,133,126,122,120,122,109,88,101,128,154,168,207,249,247,239,229,248,255,255,255,255,253,197,177,179,211,239,236,236,224,218,228,213,161,
+107,114,134,146,161,153,139,129,104,95,99,78,75,94,104,128,196,249,250,253,249,235,221,210,204,201,207,205,197,192,113,43,50,42,44,54,61,63,68,77,93,92,78,61,47,40,33,34,
+38,40,47,55,62,78,86,87,83,91,90,85,93,79,70,71,95,165,235,255,253,254,255,255,255,255,255,252,242,243,255,255,253,255,238,221,178,155,196,196,164,83,47,54,34,20,26,1,
+2,5,13,34,35,24,24,27,26,21,19,16,14,9,6,5,2,0,0,0,5,23,42,49,42,41,61,76,85,130,164,175,185,187,175,158,128,120,104,91,120,133,178,190,197,214,232,222,
+185,155,136,107,79,68,73,77,58,58,62,72,85,66,47,41,42,35,23,21,10,12,17,20,26,38,59,93,137,142,121,122,137,203,225,199,168,193,201,183,118,73,76,65,49,61,45,41,
+43,42,54,57,43,34,37,36,30,31,42,49,48,36,31,31,29,30,33,33,37,48,50,68,86,104,139,143,148,122,104,100,99,115,151,151,99,102,120,137,153,175,226,246,250,241,246,255,
+255,255,253,243,242,206,199,210,242,249,247,212,183,185,221,213,156,123,137,116,119,130,120,120,119,114,113,101,86,91,102,129,187,240,252,250,247,239,227,218,213,205,213,210,201,187,113,65,
+40,35,45,55,63,69,68,71,73,72,86,82,64,47,31,33,37,38,44,55,66,75,86,86,84,90,86,83,83,78,69,70,129,220,255,255,254,255,255,255,255,255,255,254,255,253,254,252,
+250,253,252,238,203,210,255,220,143,105,101,88,49,19,20,24,13,3,8,29,40,27,23,24,27,23,21,20,17,14,12,9,9,7,8,9,16,31,41,48,42,41,52,71,109,137,147,178,
+189,194,169,141,126,125,128,144,164,176,190,193,212,224,231,219,167,132,106,127,133,118,143,140,129,123,100,92,76,45,35,22,15,13,14,5,0,7,8,9,13,30,83,122,133,128,107,99,
+155,207,196,135,151,249,236,156,102,98,93,72,49,48,61,61,49,43,49,58,47,31,31,35,36,49,59,55,47,45,37,30,29,35,36,42,61,71,68,75,84,118,169,179,149,112,70,70,
+91,123,167,164,127,108,126,146,171,198,228,254,255,253,250,255,255,255,248,213,221,189,182,196,224,247,246,175,137,142,184,196,208,197,180,135,116,102,102,106,123,127,129,114,100,102,119,127,
+147,196,250,250,250,239,227,220,215,211,212,211,177,137,111,69,35,36,45,56,71,66,61,63,58,61,85,64,48,45,28,30,35,40,45,57,69,76,83,88,90,84,82,80,77,73,68,77,
+172,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,249,234,220,233,246,213,176,142,135,108,54,15,12,20,19,13,10,22,43,36,26,27,29,29,27,26,23,23,21,22,
+21,22,27,31,37,51,63,66,59,47,58,108,136,151,172,190,198,193,157,129,142,147,164,191,191,194,178,170,196,221,226,215,190,170,156,180,180,189,201,190,198,185,128,93,71,43,27,20,
+19,17,20,9,8,22,9,10,19,37,109,165,141,113,98,147,211,193,125,109,163,233,204,156,116,111,98,79,44,41,55,62,54,42,38,52,56,35,36,43,47,52,55,41,42,42,35,30,
+35,41,44,61,94,91,78,70,76,113,169,182,118,80,59,68,119,170,182,160,140,147,179,215,219,226,246,255,255,255,255,255,255,255,253,208,220,225,198,194,196,227,249,179,112,128,128,129,
+194,217,201,179,150,98,94,108,126,125,140,139,108,118,146,136,130,192,243,253,249,241,227,217,211,213,213,214,189,120,72,61,47,37,43,61,70,59,50,49,49,55,80,84,54,37,28,30,
+36,41,48,62,69,76,83,88,90,83,80,80,75,70,69,92,208,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,232,234,246,243,205,192,190,171,134,56,5,8,14,
+19,23,34,41,42,26,28,40,35,30,30,35,35,36,36,42,44,48,55,66,86,101,104,93,77,49,59,99,133,165,187,187,191,164,132,161,198,185,200,192,191,198,161,139,189,242,241,239,
+232,227,222,212,205,206,211,218,206,182,186,151,98,61,36,23,30,43,42,28,49,55,47,36,50,58,106,165,178,141,136,197,218,180,120,143,203,220,194,163,172,162,136,90,38,42,49,49,
+48,48,48,52,41,29,54,50,38,41,38,33,37,37,36,36,41,48,56,83,121,118,79,64,73,102,134,113,79,70,66,85,147,219,219,182,168,199,221,232,240,249,255,255,255,255,255,255,
+255,255,255,240,236,236,205,187,203,227,236,169,126,134,150,111,112,167,178,168,163,119,92,99,136,156,155,136,115,112,135,154,184,226,242,252,248,235,227,222,221,206,205,208,155,83,52,50,
+48,40,45,65,59,55,62,55,50,58,78,128,112,45,38,42,45,44,55,64,73,82,86,90,90,83,82,80,76,72,73,112,217,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,248,238,235,245,246,241,236,232,206,132,43,12,23,36,38,31,36,55,38,21,40,47,40,35,38,50,54,54,61,70,79,86,102,133,154,143,139,125,82,61,63,78,115,156,177,191,
+182,128,146,167,198,218,201,200,191,194,189,198,241,255,248,250,254,253,247,236,228,224,224,234,201,190,221,213,155,112,61,30,47,77,62,27,30,51,73,84,79,71,106,158,212,215,214,215,
+164,125,109,121,190,224,220,219,221,208,155,84,55,52,57,48,42,36,43,37,22,29,57,51,37,42,40,33,34,37,38,44,48,52,64,86,105,97,68,63,76,90,93,70,62,71,76,98,
+157,208,214,187,206,221,222,233,252,255,255,255,255,255,255,255,255,255,255,252,249,232,217,214,228,241,235,192,205,194,203,160,123,121,130,134,126,114,92,98,129,160,141,122,141,134,123,148,
+193,227,242,245,245,234,231,227,220,201,194,180,129,87,62,56,47,47,55,64,55,58,76,64,54,71,114,160,135,73,59,55,54,56,58,68,73,80,84,88,86,82,76,75,73,71,76,120,
+225,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,248,240,235,243,226,213,235,231,179,106,51,29,52,70,51,37,52,52,34,27,41,43,43,47,54,75,75,78,94,105,
+115,134,157,163,169,169,170,147,101,75,76,86,107,142,170,217,182,160,184,146,160,217,206,235,235,239,243,247,255,255,254,255,255,255,255,252,247,240,238,234,215,231,249,229,199,186,102,78,
+107,115,78,16,15,44,56,82,86,82,123,178,218,203,210,186,137,100,70,102,193,192,156,206,220,192,130,87,71,66,62,45,34,28,23,19,14,26,40,37,33,37,41,37,38,43,48,54,
+57,61,65,79,102,79,61,63,71,77,75,59,52,69,84,98,147,179,192,198,206,231,253,255,255,255,255,255,255,255,255,255,255,255,255,255,252,233,233,233,241,247,239,208,207,225,220,232,
+247,178,115,102,83,78,83,101,123,132,112,140,169,143,139,169,206,232,239,240,239,236,235,226,217,207,190,179,173,129,69,58,43,43,57,87,71,59,69,64,66,113,150,156,135,95,71,59,
+61,61,59,66,75,77,76,78,77,73,69,72,73,83,102,136,249,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,253,250,248,217,203,197,175,207,214,197,120,79,63,85,97,
+68,68,98,88,62,51,56,57,54,57,70,99,112,120,128,143,153,169,182,183,180,184,183,163,126,95,86,99,106,143,171,211,210,172,142,130,179,213,225,254,255,255,255,255,255,255,255,255,
+255,255,255,255,254,250,249,234,229,231,234,227,217,210,168,139,150,135,80,16,8,16,24,38,68,92,155,208,179,163,161,175,173,136,154,151,167,182,147,176,211,210,147,98,75,80,80,50,
+36,29,17,10,14,20,19,30,37,37,42,42,43,50,56,61,65,73,80,85,99,83,68,69,77,77,64,55,54,75,98,106,123,144,169,197,208,224,254,255,255,255,255,255,255,255,255,255,
+255,255,255,255,249,239,236,241,238,240,215,170,167,219,190,198,235,196,136,90,65,58,72,95,114,107,94,168,193,135,143,165,203,235,241,243,236,232,231,221,215,194,151,169,182,104,59,50,
+36,42,63,87,88,56,64,77,93,128,161,155,144,106,72,62,62,61,59,69,76,71,69,70,72,70,75,84,93,141,201,221,255,255,255,255,255,255,255,255,255,249,246,255,248,201,212,239,
+241,253,255,249,227,226,226,205,187,168,164,137,97,78,97,104,91,90,93,122,116,75,90,99,68,71,83,125,148,161,168,178,187,205,211,218,213,208,199,186,160,148,104,111,122,146,146,133,
+179,169,141,157,201,207,224,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,248,239,225,221,229,238,219,199,208,169,157,137,82,36,26,21,38,75,105,123,119,133,127,113,146,203,
+234,238,241,224,221,224,196,173,163,172,154,107,71,77,71,45,38,30,20,14,20,28,30,34,42,48,50,50,48,54,64,70,82,95,102,109,111,95,77,72,72,69,65,59,65,91,116,118,
+119,129,149,176,204,221,250,255,255,255,255,255,255,255,255,255,255,255,254,254,249,245,243,235,234,214,194,189,207,217,157,148,149,173,149,82,66,61,70,76,78,87,92,156,207,162,129,168,
+219,226,238,246,234,226,224,222,211,155,121,160,162,86,52,43,34,38,66,91,78,59,77,83,104,134,146,143,157,137,92,75,65,63,66,83,79,66,66,68,70,78,102,115,151,224,255,255,
+255,255,255,255,255,255,255,255,252,236,232,238,189,108,125,177,217,239,241,227,224,232,234,222,203,180,160,173,141,97,93,101,95,80,84,108,116,114,148,122,75,88,112,149,177,193,206,217,
+229,245,248,246,241,234,222,205,180,176,127,99,122,125,116,92,144,180,151,133,160,180,206,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,248,241,231,232,228,232,220,184,190,219,
+193,132,88,80,106,108,120,130,142,164,137,126,115,107,153,212,234,238,214,214,229,234,222,200,185,172,176,147,80,50,45,41,40,29,20,22,26,35,47,47,57,68,66,65,55,54,68,86,
+99,116,135,150,141,127,107,102,84,68,68,79,86,107,133,142,135,140,142,156,201,238,249,255,255,255,255,255,255,255,255,255,255,255,250,236,234,241,240,234,234,206,193,215,221,219,167,111,
+97,102,88,70,64,70,84,73,71,97,100,153,210,203,164,203,231,226,228,234,226,219,222,224,215,172,125,153,149,101,65,50,42,41,69,85,61,58,68,87,121,148,160,164,187,193,146,120,
+82,70,83,108,86,58,64,77,78,90,106,134,194,253,255,255,248,255,255,255,255,255,255,255,252,232,219,167,132,107,108,173,224,220,208,196,196,215,226,208,201,196,180,171,164,123,90,78,
+85,68,61,101,104,158,175,137,108,99,127,151,178,224,236,243,255,255,255,255,254,254,239,204,186,176,115,77,93,86,80,83,115,148,136,105,125,149,176,243,249,250,255,255,255,255,255,255,
+255,255,255,255,253,249,248,236,234,228,225,222,224,217,214,221,213,164,121,130,149,155,141,136,140,160,146,139,119,108,170,227,231,214,192,199,213,227,219,207,211,196,173,156,85,37,31,40,
+44,35,34,40,52,54,57,64,84,97,91,76,59,57,66,87,112,136,162,186,161,150,148,132,100,94,93,104,107,106,132,153,140,156,163,171,211,234,248,254,255,255,255,255,255,255,255,255,
+255,246,232,219,215,234,228,226,217,196,191,214,194,207,155,106,100,62,52,55,62,71,90,101,108,122,125,142,186,214,208,233,242,233,215,213,222,218,224,225,217,186,134,127,114,95,78,63,
+48,42,54,62,72,69,65,70,98,130,165,198,212,200,190,173,111,112,133,143,97,54,61,78,79,83,76,79,133,249,255,240,246,255,255,255,255,255,255,255,250,233,215,153,128,119,106,143,
+176,168,184,190,172,193,210,217,187,170,184,170,133,99,73,72,92,71,63,105,122,165,161,176,171,133,111,129,182,238,252,255,255,255,255,255,255,249,193,164,178,170,133,82,68,69,70,78,
+100,106,92,83,98,141,187,192,192,201,249,255,255,255,255,254,255,254,255,255,252,250,243,235,231,222,219,221,218,212,224,221,203,192,171,171,165,171,168,156,136,132,127,123,128,122,161,194,
+200,205,212,203,200,212,225,206,185,191,179,135,69,43,43,51,55,45,45,57,71,79,79,77,84,90,93,83,61,57,80,105,125,144,168,192,176,165,170,155,125,105,121,129,144,146,144,160,
+157,161,175,203,232,232,241,254,255,255,255,255,255,253,252,249,249,241,232,221,204,211,221,206,196,203,185,171,143,155,134,113,119,88,75,65,68,84,102,130,165,175,143,139,182,229,246,253,
+253,250,238,218,225,219,221,226,218,189,141,107,106,105,94,76,52,45,43,51,66,63,58,71,90,115,135,186,191,167,176,183,158,158,172,158,99,52,49,59,59,65,65,57,78,171,228,218,
+175,234,245,234,253,255,255,255,250,247,238,165,135,154,164,133,141,165,165,194,190,200,212,213,213,173,175,149,69,55,51,65,78,73,73,92,144,148,167,193,158,121,133,141,192,239,248,255,
+255,255,255,255,254,227,157,153,177,177,153,97,83,78,82,94,108,107,85,76,97,149,184,155,163,204,240,254,255,255,255,241,243,249,245,246,248,243,211,210,214,218,218,227,226,222,228,240,
+228,227,220,191,194,206,190,165,122,91,94,121,169,182,176,180,210,213,227,210,201,219,219,225,197,179,171,83,51,52,58,58,58,49,52,64,72,85,90,85,83,98,109,90,62,56,98,141,
+137,140,180,210,185,164,192,189,154,86,75,107,176,196,184,180,175,164,186,226,232,231,240,253,255,255,255,255,254,252,248,243,238,239,246,222,186,187,199,190,189,191,153,135,148,120,99,107,
+107,94,80,78,83,106,151,184,194,204,203,191,214,248,255,255,255,255,249,227,227,227,225,225,221,197,136,107,106,111,102,87,70,62,63,68,68,62,55,83,101,99,121,160,169,156,161,175,
+189,172,179,154,99,63,54,57,70,73,65,55,52,69,137,156,86,189,220,229,254,255,255,255,254,255,253,194,168,175,180,137,164,182,173,219,227,220,224,218,218,200,180,100,44,37,35,43,
+52,68,70,107,171,183,178,151,141,147,165,184,197,213,228,236,252,255,255,255,255,219,184,184,189,180,146,101,115,112,111,129,143,128,86,92,112,136,148,155,200,206,228,248,255,255,250,233,
+217,205,214,225,226,214,189,186,196,204,219,224,234,231,236,242,245,242,222,205,198,193,173,128,104,68,79,165,204,206,193,194,225,224,242,235,222,226,226,226,215,199,142,62,52,55,59,55,
+51,48,58,80,93,91,98,119,132,133,115,85,59,61,82,134,163,175,191,212,213,191,187,191,140,70,54,83,169,187,156,141,143,132,177,228,221,233,243,243,245,249,252,255,255,250,236,228,
+219,242,253,231,199,193,192,155,157,148,139,149,184,164,125,120,123,94,90,100,121,154,189,219,229,241,249,239,245,252,255,255,255,255,252,235,236,238,243,245,238,231,179,132,121,106,120,108,
+105,95,97,122,139,109,80,72,76,66,95,121,135,137,143,144,179,211,192,149,111,116,154,146,135,100,72,59,54,61,65,62,65,146,211,236,255,255,255,255,255,255,255,207,167,170,197,162,
+207,234,206,211,232,249,248,239,235,173,94,54,35,37,42,48,51,57,73,134,178,169,162,158,157,167,171,205,200,201,210,192,228,255,255,255,254,219,203,208,194,165,127,108,126,132,137,148,
+137,136,101,95,106,141,137,156,184,190,207,227,220,228,232,224,205,175,210,219,201,185,185,178,175,197,212,215,238,242,245,241,246,242,218,208,206,199,201,171,136,107,136,201,199,212,203,213,
+248,240,239,239,248,250,246,242,208,134,85,61,56,63,66,68,59,62,86,83,88,104,129,148,163,165,108,78,69,68,75,107,147,184,186,186,200,190,155,154,156,92,69,79,118,154,157,116,
+105,105,151,200,217,226,232,224,214,220,240,248,239,229,220,206,208,228,241,227,191,192,194,163,167,175,197,197,184,189,192,182,163,121,101,104,111,167,207,248,255,255,254,253,254,255,255,255,
+255,255,255,253,254,253,254,255,254,255,243,224,201,163,175,180,160,137,135,170,190,154,127,88,57,55,70,87,102,114,112,120,150,193,217,175,153,168,199,206,155,116,90,73,59,55,55,49,
+55,108,186,238,255,255,255,255,255,255,241,165,122,160,247,255,252,232,192,206,239,253,255,254,246,185,118,78,87,121,129,99,65,57,82,118,140,142,150,169,172,185,197,197,179,198,182,172,
+229,254,255,255,249,219,196,206,193,161,137,130,125,142,150,153,144,136,113,95,112,137,160,175,169,197,164,140,135,170,192,194,186,184,192,208,200,170,154,135,160,189,210,219,239,240,241,245,
+248,246,239,233,218,191,205,219,197,177,186,194,198,241,255,254,245,226,228,245,252,255,255,253,215,149,105,113,141,150,132,97,83,92,104,84,108,164,169,154,160,176,158,128,112,95,91,87,
+125,206,219,190,185,192,164,140,187,150,99,118,153,163,158,116,119,114,137,160,175,205,213,201,185,200,226,224,214,210,198,190,185,194,213,200,177,201,214,187,154,184,218,203,182,179,185,175,
+167,120,88,99,105,126,204,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,249,241,245,250,228,213,220,222,211,173,134,106,71,57,68,71,76,92,90,97,
+132,164,157,177,207,171,164,194,169,141,111,88,71,51,50,50,49,90,161,212,254,255,255,255,255,255,212,121,92,142,233,255,255,249,247,254,255,255,255,252,246,233,185,164,189,214,204,178,
+151,137,99,78,112,134,127,132,162,200,218,203,176,158,168,175,203,233,249,241,226,208,192,203,191,146,134,148,153,160,182,171,154,143,104,98,119,128,144,179,158,161,135,106,114,147,146,140,
+149,141,142,170,171,143,116,102,151,187,204,215,233,235,231,241,245,241,232,221,217,211,214,208,204,192,191,191,199,236,255,255,253,249,253,255,255,255,255,252,245,205,185,201,228,227,207,185,
+179,149,139,175,210,212,198,192,210,191,173,155,150,120,104,105,142,186,175,178,189,193,175,161,197,196,161,173,205,200,173,116,118,120,133,164,162,183,198,191,184,198,211,210,206,197,178,170,
+169,183,196,176,163,182,189,163,127,178,213,211,200,183,162,157,161,111,86,102,106,128,167,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,254,242,240,208,157,136,114,101,80,65,65,78,87,100,136,183,146,186,238,172,192,199,165,160,115,85,73,64,54,48,68,86,150,183,229,224,238,255,255,255,215,146,104,135,247,255,
+255,255,255,255,255,255,255,255,255,248,239,248,204,217,164,165,194,182,147,119,119,114,113,119,163,203,173,169,160,160,171,186,165,167,191,196,193,180,177,178,170,155,157,161,161,161,172,167,
+167,148,109,122,126,125,137,140,121,113,108,90,87,97,99,94,95,87,82,112,137,141,123,112,148,189,199,212,226,231,229,232,233,232,220,217,219,213,211,206,198,192,194,192,193,245,255,255,
+255,255,255,255,255,255,255,255,253,238,250,228,232,227,206,219,226,218,218,225,229,213,177,175,210,205,189,182,165,113,98,112,116,142,144,118,156,185,184,162,184,201,194,190,194,185,178,123,
+105,129,146,168,186,201,199,182,164,176,190,194,194,180,156,160,163,176,184,176,153,140,116,100,99,141,189,203,211,197,157,133,125,99,95,106,100,118,165,215,253,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,252,239,196,155,178,182,155,132,87,84,86,93,108,135,172,196,212,160,150,211,231,178,132,109,77,85,97,98,92,
+119,146,173,185,155,164,204,252,255,255,232,185,165,186,250,255,255,255,255,255,255,255,255,255,255,255,255,255,232,175,153,164,208,173,132,116,108,106,126,129,141,167,144,146,148,154,149,140,
+133,148,160,170,165,162,158,158,155,157,179,160,147,161,161,144,157,142,99,98,98,98,101,100,100,87,78,107,119,82,90,94,95,90,85,122,118,142,143,141,162,208,218,224,232,235,238,232,
+227,227,220,217,217,215,210,203,192,194,204,214,227,253,255,255,255,255,255,255,255,255,255,255,255,255,255,246,211,206,165,212,203,173,203,229,228,203,176,194,213,225,220,178,157,101,73,84,
+85,102,151,127,121,144,150,149,163,175,184,185,177,162,164,157,132,133,160,190,225,222,199,185,171,173,178,183,176,165,150,160,168,176,175,175,151,144,98,77,79,112,182,207,198,155,118,119,
+114,92,95,122,106,121,151,153,224,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,231,201,160,126,98,120,183,190,143,101,94,88,99,121,
+140,154,183,187,148,146,171,222,231,156,108,78,88,71,64,76,62,173,176,162,148,185,212,236,254,255,248,198,170,207,253,255,255,255,253,254,255,255,255,255,255,255,255,249,250,200,170,175,
+170,141,98,83,111,119,123,118,125,137,119,112,113,126,141,129,115,122,132,135,132,135,153,149,146,160,189,175,182,203,172,142,128,120,88,64,61,57,59,70,82,76,82,116,121,104,107,112,
+93,78,87,93,94,140,147,154,194,228,234,238,247,249,246,242,239,231,231,227,218,220,208,205,193,196,203,214,240,255,255,255,255,255,255,255,255,255,255,255,255,255,248,249,226,192,167,171,
+158,121,130,205,228,228,219,222,210,193,185,170,156,95,55,58,68,73,101,133,135,107,114,128,130,108,137,161,150,142,153,149,126,125,162,222,254,239,218,207,198,222,226,210,208,186,158,160,
+155,170,163,155,158,153,123,102,113,158,201,206,173,118,79,95,118,101,92,115,115,109,151,127,135,218,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,204,129,106,85,64,56,84,84,56,66,72,70,86,102,118,136,156,161,160,147,99,92,153,143,100,73,66,45,28,8,28,64,120,147,164,194,196,226,240,247,224,162,128,183,239,247,
+243,231,245,254,255,255,255,255,255,255,255,255,255,215,186,139,85,70,57,63,76,90,102,98,99,106,90,91,99,115,148,143,116,107,104,106,113,129,139,134,140,160,184,191,225,236,186,133,
+109,111,101,78,61,54,45,57,78,83,83,109,118,136,156,141,102,90,106,101,125,137,120,150,203,234,238,243,252,254,252,245,241,240,236,224,227,229,221,207,183,173,160,173,213,248,250,250,
+250,254,255,255,255,255,255,255,255,255,254,255,227,183,148,76,62,52,88,165,183,229,234,229,190,123,128,163,161,130,73,43,57,70,84,128,142,105,86,86,84,55,85,116,121,133,140,127,
+114,140,186,245,255,255,247,250,246,249,255,252,255,243,231,218,189,204,206,173,164,170,168,158,167,191,192,179,165,147,125,127,120,105,95,106,128,121,137,112,88,151,175,205,255,253,218,212,
+254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,247,253,239,162,102,76,63,55,48,50,50,55,57,63,72,76,77,100,116,115,94,90,70,57,78,83,73,64,49,48,45,34,
+21,12,100,172,163,168,142,134,122,125,120,82,86,128,184,204,221,225,253,255,255,255,255,255,255,255,255,255,255,190,106,83,55,42,45,56,73,82,85,83,77,79,78,86,105,135,161,136,
+106,98,92,99,106,100,107,116,127,125,136,172,215,239,242,208,165,157,141,115,85,51,44,58,88,101,78,80,109,140,134,109,100,100,113,98,121,129,147,206,221,238,242,247,249,252,249,248,
+246,239,229,224,225,229,221,194,157,173,170,171,168,197,213,228,242,253,255,255,255,255,255,255,255,255,255,255,213,100,77,42,24,30,54,153,187,206,217,210,191,140,127,143,149,146,111,61,
+43,51,80,107,104,86,69,64,71,62,79,90,106,120,130,127,136,165,218,255,255,255,255,255,255,249,255,255,255,255,255,254,247,253,255,227,205,198,190,187,160,150,160,158,153,141,126,129,
+104,92,102,121,146,126,109,104,102,125,104,126,173,197,169,203,253,255,255,255,255,255,255,255,255,255,255,255,255,246,241,245,236,242,250,200,135,94,75,63,50,49,55,54,55,65,57,51,
+48,56,69,73,57,54,50,51,54,57,58,57,45,44,41,37,16,21,128,144,111,99,55,31,21,21,34,45,65,86,126,153,196,245,255,255,255,255,255,255,255,255,255,255,255,173,88,68,
+59,50,54,58,66,73,70,71,71,78,84,87,113,163,158,108,87,80,80,88,94,85,83,94,112,115,121,184,194,213,224,240,246,207,196,169,118,63,52,61,84,90,78,79,97,116,139,118,
+98,95,101,106,147,175,179,219,214,227,222,238,245,253,250,236,201,211,222,226,231,225,205,192,183,177,167,146,142,142,154,193,241,255,255,255,255,255,255,255,255,255,255,255,200,83,56,37,
+26,23,31,71,142,170,165,151,134,127,133,142,129,135,142,94,24,30,49,71,79,69,56,47,63,79,88,94,114,122,134,143,163,187,236,255,255,255,255,255,254,254,255,255,255,255,255,255,
+255,255,255,255,241,211,196,191,175,178,179,179,151,129,120,122,112,109,115,134,143,111,85,90,105,127,107,95,105,177,183,212,255,255,255,255,255,255,255,255,255,255,255,255,253,243,238,252,
+254,242,229,211,178,143,107,86,71,65,68,55,50,56,44,36,36,35,41,42,44,41,43,43,47,48,49,50,47,44,38,34,24,37,83,78,44,28,21,13,10,23,44,72,63,70,76,101,
+162,226,255,255,255,255,255,255,255,255,255,255,255,221,106,73,84,82,73,66,62,66,61,58,82,116,104,99,156,176,142,106,86,71,69,77,84,86,78,79,87,105,107,203,206,205,225,231,
+252,210,179,167,134,83,57,55,62,71,80,72,92,116,162,148,109,129,143,146,187,190,168,139,105,154,193,215,190,210,224,177,115,161,199,204,210,211,213,212,201,156,127,102,114,129,141,175,
+220,255,255,255,255,255,255,255,255,255,255,255,243,115,55,44,49,36,29,21,57,91,111,105,76,93,135,141,105,134,135,57,12,22,36,54,61,66,52,35,51,73,85,106,132,140,154,170,
+196,222,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,215,199,197,203,205,198,180,147,142,153,140,133,125,118,105,121,126,119,106,106,125,122,102,118,163,167,153,
+232,249,255,255,255,255,255,255,255,255,255,254,255,252,246,255,255,253,241,227,206,153,109,88,87,83,85,63,45,41,36,30,30,31,33,35,36,35,38,38,38,43,40,47,45,44,41,34,
+35,49,64,52,28,23,20,31,76,113,141,122,70,59,66,84,118,175,211,252,255,255,255,255,255,255,255,255,247,193,183,151,129,112,88,73,69,75,68,66,108,167,148,134,196,197,147,126,
+97,72,68,75,82,80,72,69,72,86,94,156,193,211,197,207,200,205,165,137,111,65,59,54,49,59,72,70,75,93,127,122,118,114,121,114,120,107,64,42,52,94,135,114,93,121,137,128,
+88,119,146,162,168,165,194,215,214,198,177,169,171,165,171,176,187,201,241,255,255,255,255,255,255,255,255,252,182,173,149,105,72,36,24,17,38,75,106,85,55,73,137,139,100,137,86,15,
+10,17,36,47,44,56,52,38,43,58,75,128,170,180,193,213,235,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,210,189,185,203,204,190,157,136,182,193,167,
+148,120,109,107,114,116,133,129,129,153,150,127,146,163,161,149,196,245,255,255,255,255,255,255,255,255,253,250,241,221,228,253,255,255,253,241,220,163,108,70,61,57,55,54,44,36,31,27,
+26,28,29,28,30,29,34,35,36,37,37,45,45,45,42,40,41,68,66,56,54,50,57,71,106,144,142,101,54,45,49,70,98,132,169,224,250,255,255,255,255,255,255,255,252,226,184,184,
+157,127,102,79,70,82,90,95,116,191,239,231,234,224,187,139,98,82,73,76,76,72,66,65,69,87,112,125,144,190,184,190,203,193,132,105,68,48,47,45,43,52,63,56,45,63,80,80,
+80,69,91,92,56,40,30,30,37,59,90,66,41,62,73,73,90,115,107,109,130,107,121,162,191,198,200,212,201,169,156,157,158,158,205,245,255,255,255,255,255,255,255,254,219,177,170,154,
+90,30,22,24,31,48,61,61,44,59,130,147,135,140,43,8,12,21,35,31,30,45,55,47,38,48,71,135,193,227,238,254,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,249,197,155,167,186,204,170,133,155,164,190,187,153,130,108,106,98,121,160,157,156,176,172,165,170,192,210,220,220,253,255,255,255,255,255,255,255,255,254,248,234,219,238,245,
+243,254,252,231,201,162,105,66,52,47,43,41,40,35,30,28,23,24,22,22,21,21,28,34,37,40,42,47,43,42,43,40,61,91,57,66,73,99,125,128,134,147,126,88,31,19,24,52,
+88,121,168,220,239,252,255,255,255,255,255,255,255,255,231,191,151,128,108,84,75,82,95,123,135,172,253,255,241,172,155,120,98,90,75,72,70,70,66,66,77,104,143,148,116,128,139,148,
+182,199,134,115,73,43,34,35,36,51,61,48,40,57,71,62,52,61,78,68,34,20,24,26,29,50,82,73,49,58,58,56,78,84,82,104,105,98,123,171,198,206,207,211,193,175,163,161,
+155,156,206,232,248,255,255,255,255,255,254,255,255,234,192,127,73,31,23,24,35,50,52,49,47,49,90,140,120,84,21,9,12,17,22,22,28,38,48,50,50,56,106,143,163,169,199,255,
+252,214,212,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,231,217,247,227,176,168,186,193,160,161,163,140,172,197,172,147,118,109,111,136,192,203,186,179,203,227,236,249,250,232,
+205,235,255,255,255,255,255,255,255,255,255,253,245,242,245,233,222,232,233,207,178,129,82,58,49,44,40,40,37,36,34,29,24,24,20,17,14,16,24,33,40,44,48,52,48,44,48,34,
+59,63,52,54,59,115,139,141,149,153,137,100,36,16,13,44,80,99,147,231,218,236,255,255,255,255,255,255,255,255,246,165,140,121,102,91,82,88,126,169,187,228,255,255,219,118,98,94,
+88,82,69,65,65,72,73,72,85,111,146,157,119,115,109,105,148,183,158,130,101,61,43,36,36,55,57,41,40,55,63,61,64,65,57,34,21,17,19,20,42,62,72,83,68,52,51,56,
+62,61,91,134,129,150,190,197,176,177,197,203,204,192,172,140,116,129,212,221,221,255,255,255,255,254,252,255,255,255,176,122,78,45,35,31,41,56,51,37,35,27,21,44,29,15,19,16,
+10,12,17,28,45,48,51,64,84,97,139,151,151,130,144,180,201,176,208,255,255,255,255,255,255,255,255,255,255,255,255,254,224,201,167,136,200,236,198,173,180,190,196,171,144,161,197,210,
+198,162,126,118,163,189,203,211,205,211,232,238,249,255,254,238,210,242,218,226,250,255,255,255,255,255,255,255,249,248,238,213,200,211,218,213,183,151,101,61,43,36,37,35,36,35,33,28,
+24,22,20,10,8,14,23,35,44,49,48,50,50,51,55,54,64,58,56,50,48,65,104,136,160,142,65,21,14,13,17,41,77,78,114,193,217,228,255,255,255,255,255,255,255,255,207,121,
+104,101,88,88,94,153,217,248,242,250,255,255,232,119,91,84,80,78,68,62,61,71,85,85,95,116,146,151,120,101,97,101,144,172,198,162,123,83,52,48,49,47,40,37,43,43,44,51,
+63,55,36,22,17,13,10,13,31,44,47,62,49,36,51,64,76,86,92,108,170,189,167,151,99,109,150,172,176,150,116,100,79,85,161,207,210,252,255,254,255,255,255,255,255,234,142,113,
+95,75,57,45,45,52,51,35,20,19,7,3,13,14,23,20,12,15,35,51,54,52,65,93,122,155,153,137,149,137,133,133,184,189,226,255,255,255,255,255,255,255,255,255,255,255,255,252,
+211,180,173,148,143,167,172,183,186,187,199,179,171,199,219,222,220,196,162,151,185,184,182,194,205,218,217,219,228,246,254,249,232,192,144,183,233,250,255,255,255,255,255,255,254,250,226,192,
+204,219,221,206,187,186,118,52,45,38,36,36,37,35,27,26,24,21,19,14,9,16,26,37,47,51,54,52,52,55,59,69,64,64,66,66,61,54,95,130,143,75,13,7,17,19,27,40,
+62,66,92,150,204,227,247,248,252,255,255,255,255,255,232,118,79,91,97,109,132,207,255,255,255,255,253,252,235,173,112,84,78,76,70,65,64,73,90,94,102,127,128,125,108,92,94,106,
+140,179,205,140,101,83,65,57,58,47,41,45,36,38,35,33,37,37,24,13,7,5,5,5,14,27,28,33,29,35,57,75,98,120,107,84,83,77,66,73,52,52,80,106,113,98,76,66,
+56,62,115,173,201,227,231,233,255,255,255,255,255,254,170,79,83,91,72,52,50,57,57,42,33,19,13,24,26,23,24,20,21,54,76,73,59,64,72,123,183,178,167,151,153,150,140,144,
+173,196,189,235,249,255,255,255,255,255,255,255,255,252,252,255,234,190,165,160,170,161,163,189,208,208,210,221,180,197,206,191,197,176,163,158,167,149,140,156,172,179,185,191,196,212,221,233,
+215,186,191,229,242,248,255,255,255,255,255,255,255,248,221,213,229,229,219,186,170,191,157,79,52,50,45,43,38,29,26,23,21,20,17,16,15,26,35,43,51,61,65,57,56,61,65,69,
+77,87,92,100,116,137,129,116,90,44,33,35,30,28,31,34,49,73,109,125,170,211,234,254,255,255,255,255,255,255,222,134,84,88,126,173,226,246,255,255,255,254,254,242,169,179,157,95,
+83,80,75,69,70,72,84,85,93,116,104,97,85,88,95,115,148,187,191,144,93,72,78,68,50,47,43,38,35,35,40,30,35,30,19,9,3,1,0,0,3,10,19,26,30,41,52,84,
+87,106,133,102,61,41,37,54,56,51,59,66,79,80,52,48,59,87,105,136,178,192,222,232,252,255,255,255,255,254,192,125,107,93,64,54,49,45,42,41,47,47,65,71,36,30,27,22,
+43,94,109,106,85,99,107,149,190,193,201,208,200,179,158,167,182,196,179,198,245,255,255,255,255,255,255,255,252,240,242,235,206,203,210,206,198,186,192,206,211,194,206,224,199,167,151,118,
+129,106,105,121,133,108,95,116,134,141,150,157,161,183,203,219,201,211,242,249,254,255,255,255,255,255,255,255,255,254,248,241,239,240,227,192,169,203,187,130,98,76,64,43,33,30,28,24,
+21,19,21,20,29,37,47,52,58,66,75,69,62,64,71,73,95,102,123,171,206,210,165,141,118,71,61,57,44,41,36,37,58,102,120,136,175,192,243,255,255,255,255,255,255,243,184,139,
+109,100,128,171,231,243,248,255,255,255,246,228,162,171,179,102,91,90,79,73,75,70,78,82,87,114,109,82,76,97,108,115,139,204,222,176,122,92,80,79,65,55,52,59,55,41,38,35,
+31,26,15,7,5,0,0,0,0,0,12,17,22,33,55,76,90,106,122,95,82,47,26,30,36,37,40,59,70,55,36,57,102,111,112,141,153,178,205,215,226,233,233,249,254,231,194,173,
+140,105,80,54,36,33,33,35,59,144,146,92,65,63,50,42,62,104,141,135,108,125,142,157,190,210,220,231,225,213,199,192,218,234,238,228,253,255,255,255,255,255,255,254,248,239,233,226,
+210,232,236,224,197,184,201,200,193,173,206,229,192,134,112,84,80,68,63,69,82,66,63,72,88,100,105,112,134,161,184,198,192,221,243,247,250,255,255,255,255,255,255,255,255,255,254,254,
+250,245,233,219,204,208,217,204,151,99,83,44,37,33,24,22,22,23,26,29,43,56,54,59,69,72,77,76,77,73,75,86,100,100,118,178,184,177,153,147,186,168,146,102,65,56,49,50,
+59,76,102,146,205,231,249,255,255,255,247,242,239,215,185,137,113,116,128,127,151,186,215,238,245,222,208,220,147,134,132,109,99,97,90,80,77,76,75,73,85,109,132,106,101,114,147,167,
+160,211,245,214,151,128,91,86,72,72,93,144,99,42,37,33,24,22,13,6,6,3,3,3,1,1,7,12,19,44,70,69,76,76,69,63,59,42,20,22,31,41,58,68,61,43,37,54,
+78,98,123,148,157,161,168,180,186,191,207,228,220,221,207,176,164,121,73,43,29,31,35,44,73,147,167,118,111,106,77,116,156,179,213,177,139,167,173,192,210,233,241,233,233,242,245,247,
+254,255,253,233,241,255,255,255,255,255,255,253,245,239,238,234,239,243,225,204,187,186,189,179,160,161,200,208,162,105,73,70,68,52,43,37,45,43,43,47,58,65,50,45,68,87,135,183,
+196,221,236,246,248,254,254,255,254,252,254,255,255,255,255,255,254,247,238,227,218,191,187,180,136,88,82,56,47,34,26,23,22,26,30,43,57,65,64,63,76,83,82,79,78,85,82,85,
+100,95,94,108,119,150,183,171,165,225,247,200,111,100,80,76,55,42,57,123,193,229,249,255,255,233,217,211,206,194,164,127,112,115,115,135,156,204,205,180,192,186,205,214,168,128,119,133,
+118,102,99,85,78,78,66,65,83,101,122,126,114,119,167,219,211,215,234,208,196,177,132,142,120,134,170,208,156,43,40,43,24,21,20,10,8,3,3,6,7,5,8,13,23,48,62,61,
+59,55,52,54,47,34,29,36,42,51,51,50,47,47,47,45,51,78,109,121,132,135,137,143,158,179,207,212,196,196,198,191,170,126,77,50,40,44,54,69,136,179,192,187,190,178,183,214,
+205,205,220,217,193,191,177,219,245,252,252,246,249,254,255,255,255,255,255,247,248,222,225,249,255,255,255,253,246,236,238,241,246,235,203,180,185,205,205,183,177,171,187,191,141,88,66,65,
+50,37,31,29,41,37,29,37,43,41,26,19,24,30,52,141,192,198,218,225,233,250,254,250,249,248,248,253,253,254,254,254,254,253,245,235,215,147,137,147,148,133,112,70,40,35,33,28,
+28,31,35,47,61,68,84,86,85,86,92,97,94,88,99,108,120,99,91,104,133,179,194,200,225,228,233,255,208,201,121,66,45,37,36,71,115,164,185,196,219,190,163,169,179,193,179,147,
+134,122,107,134,169,190,207,186,165,167,196,198,179,140,137,185,168,99,98,88,84,93,70,61,78,127,158,154,140,119,156,211,226,215,233,197,232,238,224,222,201,220,233,220,211,100,47,80,
+56,22,12,10,8,3,6,12,12,7,10,19,30,45,56,63,58,62,62,52,40,23,26,29,29,34,34,38,43,72,83,58,54,64,71,73,85,98,98,111,136,144,190,211,212,217,222,187,
+143,100,83,69,63,66,69,113,218,242,241,254,246,246,255,233,201,192,208,229,221,226,220,245,255,255,255,254,255,255,255,255,255,255,255,253,219,161,178,228,246,253,253,253,250,242,240,245,
+246,219,178,191,210,217,203,191,200,175,172,200,148,108,83,54,42,38,27,27,36,33,30,31,27,29,27,22,13,14,22,100,153,118,127,123,120,180,245,247,249,250,246,245,247,248,252,254,
+254,253,245,240,226,171,157,153,142,149,99,54,35,35,34,34,35,35,36,43,55,56,70,93,102,100,102,118,121,98,114,162,164,107,118,157,167,222,203,224,255,254,204,213,227,228,111,55,
+43,40,36,36,57,78,93,107,123,123,139,162,163,191,182,164,147,144,114,112,142,161,170,185,150,130,151,197,198,141,148,250,215,97,91,87,88,97,78,72,75,98,150,200,196,148,160,161,
+178,197,190,200,238,247,255,250,240,248,248,240,211,115,70,100,105,48,16,13,8,5,8,12,14,13,16,27,41,54,63,68,78,91,57,30,17,13,12,13,15,17,21,40,75,119,116,73,
+66,64,54,52,63,65,65,70,78,101,171,225,233,233,214,173,137,112,99,80,87,90,92,175,249,249,255,255,255,254,252,248,245,239,235,236,240,240,231,249,255,255,255,255,255,255,255,254,
+254,253,252,240,210,196,227,238,245,254,253,252,252,250,248,249,239,206,197,219,222,215,190,180,204,196,168,171,155,120,77,48,37,31,26,27,30,31,29,33,33,36,31,23,13,13,21,45,
+69,73,112,134,122,140,214,247,248,250,243,235,228,232,245,249,252,252,246,236,232,208,149,118,95,83,48,40,42,35,34,34,38,38,41,47,62,68,68,73,86,98,98,122,127,101,93,189,
+192,164,183,235,204,177,173,210,250,255,198,189,193,233,133,63,49,45,40,33,41,55,70,87,91,109,147,168,151,153,144,147,133,121,101,97,116,143,151,160,139,113,115,165,184,163,176,246,
+226,105,91,97,100,101,92,98,97,95,119,151,157,143,146,158,168,190,180,158,187,231,247,253,254,253,253,254,222,130,143,161,154,88,37,29,20,9,8,9,13,14,17,28,41,57,70,71,
+66,59,30,12,2,0,2,7,9,13,20,35,61,85,78,61,57,61,54,51,52,59,61,62,114,135,154,229,231,197,163,163,137,121,107,98,127,154,163,245,255,254,255,255,255,254,255,250,
+238,236,241,252,250,242,242,254,255,255,255,255,255,255,254,252,253,250,249,220,218,241,248,253,252,254,254,254,253,254,254,253,250,238,224,221,231,222,197,182,213,210,185,160,132,99,55,34,
+34,33,34,41,42,31,33,43,49,45,22,16,13,14,15,20,42,59,78,116,135,112,148,222,246,243,236,220,213,225,240,247,246,247,243,224,179,120,73,64,58,54,49,42,41,38,36,37,
+37,40,44,52,69,78,70,62,76,91,90,112,119,94,80,128,182,207,228,250,239,173,182,205,231,248,255,253,200,165,109,65,54,45,38,35,36,44,54,65,80,100,115,116,104,100,108,120,
+108,95,85,82,93,116,140,130,118,118,114,125,153,185,194,241,252,151,127,144,134,126,122,126,140,135,126,125,120,106,128,156,169,163,170,177,155,208,252,255,255,255,255,255,248,221,210,182,
+157,115,69,61,36,21,19,16,10,8,14,22,37,50,61,63,47,22,7,0,0,0,0,0,7,19,24,28,37,54,56,43,42,47,56,54,52,70,112,163,212,211,222,247,242,173,142,148,
+135,116,100,141,221,247,249,255,254,255,255,255,255,255,255,249,222,233,248,255,255,254,254,255,254,248,235,234,241,242,229,238,248,250,240,212,228,243,243,243,250,249,255,253,253,254,254,255,
+253,250,246,239,233,226,220,212,218,222,211,168,125,88,49,38,38,37,35,48,58,36,34,48,54,47,33,20,10,17,17,19,36,48,62,85,101,116,119,171,226,235,215,182,199,218,238,247,
+243,243,240,222,169,88,69,65,62,59,51,42,40,37,37,40,41,45,50,59,59,66,59,56,75,87,86,91,91,88,93,127,134,136,172,201,227,156,165,189,162,210,254,225,122,87,68,63,
+56,47,38,35,33,33,35,43,56,73,80,75,68,75,86,95,93,86,78,75,82,104,133,126,118,132,121,133,130,137,183,242,250,193,206,232,215,180,164,155,165,161,137,115,90,82,104,171,
+234,232,221,214,215,242,255,255,255,255,255,249,242,217,207,161,116,98,94,84,56,36,31,23,14,9,10,15,28,41,44,43,29,8,0,0,0,0,0,0,3,15,24,24,29,41,58,56,
+54,51,50,61,56,75,151,210,218,232,246,254,245,207,199,221,236,206,175,214,255,255,255,254,254,255,255,255,255,255,255,253,240,247,255,255,255,255,255,255,250,245,232,221,207,186,164,172,
+179,210,236,225,232,238,243,243,249,252,252,250,250,253,254,254,254,255,254,250,238,231,228,224,203,197,185,147,100,76,48,45,44,36,34,41,45,31,27,40,54,51,44,29,20,21,26,23,
+30,43,56,85,135,148,161,198,213,220,212,201,214,215,221,232,239,239,233,233,197,114,82,73,69,59,52,48,44,43,42,42,47,57,61,70,57,54,55,57,65,75,80,84,76,76,97,127,
+100,108,118,132,162,125,140,170,125,148,215,215,127,80,62,59,54,44,36,33,30,29,28,31,41,47,54,55,55,59,68,73,84,79,73,70,77,108,137,118,113,128,118,163,142,123,171,225,
+212,219,253,255,247,194,179,187,189,169,132,88,75,87,114,204,255,248,252,253,255,255,255,255,255,255,255,211,162,158,187,149,121,95,79,92,83,64,45,34,22,9,6,9,19,38,36,41,
+29,8,0,1,0,0,0,0,2,13,21,24,36,50,63,65,69,70,54,56,59,66,104,172,231,239,239,253,254,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+253,250,255,255,255,255,255,253,252,249,253,233,193,153,120,125,108,112,198,232,211,221,219,226,247,252,247,246,245,245,250,250,254,254,255,254,252,242,234,220,165,158,157,139,104,73,47,42,
+40,35,36,37,36,27,24,33,49,49,36,31,30,36,35,31,31,45,63,104,173,162,153,173,180,187,207,214,220,219,201,192,217,200,164,197,183,112,91,79,66,56,56,54,54,54,51,52,
+52,55,62,66,64,56,56,58,56,61,70,76,72,71,75,84,86,104,105,122,134,116,123,112,93,112,137,156,120,71,58,54,48,41,34,33,30,29,27,29,36,41,42,43,47,49,56,64,
+76,77,73,65,77,118,148,150,134,109,104,127,122,114,149,182,160,177,231,255,242,229,222,196,186,165,134,79,63,82,116,198,255,255,255,255,255,255,255,255,255,255,253,190,116,102,144,192,
+163,123,101,91,93,99,79,42,33,19,15,15,22,35,31,31,21,9,1,0,0,0,0,0,10,17,24,42,48,45,50,56,59,66,59,63,64,70,84,137,217,232,240,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,249,252,250,247,233,196,143,113,99,102,82,84,162,197,122,97,76,85,149,235,241,236,235,226,234,242,
+248,253,255,255,253,242,239,229,180,165,150,122,94,62,44,37,36,37,38,36,38,31,26,31,43,44,37,31,30,37,33,31,31,51,75,94,135,151,118,106,118,141,192,204,190,212,198,183,
+187,161,123,128,125,83,57,49,49,49,52,56,58,59,58,57,56,58,64,66,66,61,57,56,55,56,63,71,76,70,66,70,72,80,100,112,129,126,109,82,76,79,84,83,73,62,54,49,
+43,37,33,33,33,29,28,31,34,36,36,35,38,44,47,51,66,84,83,78,95,119,148,179,162,112,91,91,91,88,99,114,130,171,182,219,225,212,207,190,187,157,113,75,58,78,116,178,
+238,255,255,255,255,255,255,255,255,255,255,218,120,93,93,143,171,123,106,109,92,120,95,55,54,58,43,24,30,37,44,38,21,5,0,0,0,0,0,3,19,24,28,43,48,41,43,48,
+48,55,66,73,66,79,84,125,200,225,247,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,248,240,242,233,226,201,167,139,116,115,113,
+111,108,97,93,58,43,42,38,52,133,218,211,215,206,208,199,212,242,250,253,250,243,234,232,211,158,128,104,79,56,47,41,36,35,37,37,45,41,27,30,34,38,37,33,26,24,24,30,
+33,49,78,102,101,101,100,91,115,147,171,193,191,208,192,197,192,142,118,100,86,65,42,33,38,47,51,56,58,61,62,59,58,57,59,62,62,58,55,54,51,56,62,69,76,66,63,65,
+64,69,86,108,113,100,76,64,68,72,71,68,63,58,52,45,42,35,35,34,33,31,30,30,34,34,33,31,33,36,43,48,61,85,92,92,115,121,130,167,170,125,90,84,80,80,90,98,
+114,133,136,172,222,192,207,198,191,144,91,75,69,78,93,135,219,255,255,255,255,255,255,255,255,255,255,240,115,77,72,95,140,132,114,120,102,119,95,70,66,85,62,27,35,41,50,47,
+27,6,0,0,0,0,0,16,20,20,21,30,37,43,52,54,51,56,65,71,78,88,98,148,224,248,250,252,248,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,254,254,247,239,236,231,222,214,200,171,171,167,153,123,118,99,51,37,31,26,23,27,38,70,170,204,200,201,176,144,167,222,241,241,245,239,219,179,134,105,97,93,77,63,55,50,
+40,35,35,36,42,38,35,34,34,35,33,28,21,20,22,26,34,52,90,115,94,72,75,100,136,167,183,193,200,206,199,211,200,143,109,94,77,58,47,35,37,43,51,55,58,62,61,59,
+56,55,56,56,57,55,50,48,48,51,54,56,56,56,57,61,59,63,69,84,84,75,70,65,64,66,64,62,58,57,52,47,45,40,36,35,35,35,35,31,31,31,31,29,29,34,40,45,
+58,72,80,86,93,118,143,154,176,149,105,87,85,84,88,94,113,122,129,190,236,189,194,206,183,132,84,93,98,93,104,102,179,254,255,255,255,255,255,255,255,255,255,212,108,78,69,78,
+119,116,98,107,134,140,109,71,79,87,71,35,34,38,38,26,6,0,0,0,0,0,6,13,10,12,15,26,38,51,63,59,52,61,70,82,92,92,100,137,225,254,245,248,254,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,235,220,226,197,189,204,201,193,193,186,158,115,80,55,34,24,19,14,14,15,26,42,87,172,199,163,85,76,
+121,201,236,238,239,234,217,168,104,101,100,93,82,72,64,54,43,38,31,33,34,35,29,29,34,34,28,23,19,17,21,24,34,54,88,109,88,68,68,75,94,119,167,198,205,204,204,215,
+203,144,102,97,76,57,43,36,37,42,50,54,55,59,58,57,54,54,52,50,52,48,44,43,45,47,47,43,44,45,50,58,54,58,62,69,73,69,65,62,61,58,59,58,54,54,52,50,
+49,40,35,34,35,34,31,30,27,24,27,27,26,27,31,44,52,58,66,76,86,137,183,175,169,127,121,116,94,79,86,90,121,156,144,193,219,173,197,194,178,155,132,127,143,130,148,133,
+161,227,252,255,255,255,255,255,255,255,255,187,108,97,92,91,97,98,87,77,116,121,80,57,68,75,64,40,31,34,28,10,0,0,0,0,0,0,0,1,3,12,22,33,50,72,70,63,
+62,77,99,100,87,104,135,182,239,247,227,194,240,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,228,211,196,154,133,134,154,183,187,153,118,91,
+56,34,23,20,17,13,12,13,20,33,47,98,149,119,57,52,70,121,196,229,231,227,228,197,127,111,112,106,93,83,66,52,43,40,34,30,33,31,24,24,27,27,22,19,19,19,20,27,
+40,43,52,70,71,63,64,65,79,112,155,199,194,197,200,203,187,150,125,105,77,56,48,44,43,43,47,49,52,55,55,56,55,52,51,50,47,43,38,38,42,42,40,40,42,42,48,54,
+52,55,57,61,68,65,58,55,54,54,57,54,50,50,49,55,55,41,31,30,29,26,26,22,22,21,22,21,23,26,28,40,49,52,62,76,101,175,208,189,184,182,163,154,125,95,84,83,
+120,151,132,163,192,165,192,208,208,197,220,186,182,160,164,169,208,228,247,255,255,255,255,255,255,255,255,219,153,123,115,111,87,76,69,65,71,58,34,40,42,42,44,36,30,35,23,12,
+0,0,0,0,1,0,0,1,14,27,34,54,90,114,108,78,87,113,135,114,104,128,157,199,233,236,190,156,215,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+252,255,255,255,243,199,171,157,125,78,91,121,148,132,98,78,49,27,23,26,17,13,12,14,20,28,35,43,55,50,48,48,51,70,133,185,163,143,191,184,127,118,116,106,93,87,66,56,
+48,38,37,36,34,30,26,26,26,24,21,15,14,17,19,24,35,38,43,52,58,62,70,82,106,142,185,182,144,187,189,189,170,164,146,108,92,77,68,59,48,43,45,48,54,57,56,54,
+51,49,48,45,43,42,35,34,37,38,40,40,38,38,44,49,49,50,49,54,58,57,50,44,44,48,48,47,51,49,48,68,75,41,27,26,22,19,21,20,21,19,17,19,17,20,24,31,
+40,47,61,94,141,172,163,139,177,236,222,186,149,127,94,72,97,107,114,142,155,156,175,201,214,227,239,226,217,192,203,233,252,255,255,255,255,255,255,255,255,255,255,255,226,140,99,93,
+73,59,52,61,48,23,19,23,17,15,21,24,24,26,24,19,0,0,1,14,13,10,15,20,34,34,34,68,125,137,128,107,121,136,168,146,148,177,215,211,198,199,160,179,218,254,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,255,254,253,246,212,167,147,109,80,86,91,116,114,80,72,49,33,22,23,22,17,16,20,31,35,31,31,29,34,40,42,
+48,65,106,100,82,82,112,130,102,88,78,77,79,79,70,61,50,44,41,42,38,30,28,28,27,26,21,15,15,16,17,21,28,33,37,45,56,68,73,86,102,111,128,114,94,136,153,161,
+175,184,173,150,143,114,80,65,54,49,49,48,52,56,57,56,50,47,47,43,40,37,33,35,35,34,35,35,35,34,38,44,42,44,42,42,44,41,38,35,30,30,36,42,41,44,56,78,
+82,43,30,24,19,16,19,17,16,14,12,12,9,10,16,21,27,34,45,82,128,153,141,120,133,207,211,167,116,107,79,57,79,94,80,122,176,175,187,210,226,235,228,232,245,240,233,255,
+255,255,255,255,255,255,255,255,255,255,255,254,242,144,71,54,50,47,35,41,47,27,20,15,14,12,14,19,20,24,30,23,6,0,31,51,49,51,57,63,48,24,24,72,135,142,148,128,
+135,158,198,205,190,222,245,235,234,191,182,175,226,252,255,255,255,255,255,254,255,255,255,255,255,255,255,255,254,249,252,255,255,252,249,246,236,213,169,154,125,111,111,104,123,111,78,58,
+42,30,22,20,23,21,24,30,38,35,28,28,24,27,29,31,36,61,115,105,80,71,87,98,93,82,66,71,76,73,66,58,48,42,37,40,37,34,31,30,29,28,22,19,16,14,16,19,
+23,29,31,40,49,56,70,65,63,69,70,64,66,75,105,135,165,184,178,165,151,113,78,64,56,52,51,50,55,57,57,51,45,42,42,38,34,31,34,35,34,33,34,34,34,31,33,36,
+34,35,35,33,34,41,34,26,22,21,22,21,24,44,68,82,80,43,35,30,22,20,21,14,9,8,6,3,1,2,8,14,17,21,26,44,79,98,122,141,100,149,170,167,129,70,56,45,
+94,121,73,123,206,197,197,215,229,239,231,236,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,245,134,57,36,28,20,19,24,43,33,23,30,28,12,15,21,20,21,27,57,
+47,17,44,63,70,69,80,83,45,19,20,71,129,156,175,178,191,180,170,175,184,201,210,215,217,199,194,176,235,249,254,255,255,255,246,250,255,255,255,255,255,255,253,252,250,245,249,238,
+234,239,236,239,219,200,165,127,118,149,155,153,158,133,116,79,49,28,21,22,19,21,24,33,34,27,23,21,19,20,22,22,31,49,99,98,77,66,78,84,86,80,71,71,68,64,58,51,
+44,40,37,36,36,34,33,34,31,27,22,19,14,13,16,19,20,23,24,26,27,34,51,51,45,47,57,61,62,69,83,92,119,141,139,111,88,80,72,63,56,55,54,56,52,54,54,44,
+40,36,35,31,30,30,31,31,33,30,31,33,29,28,30,31,30,30,31,34,36,62,36,14,13,10,10,10,17,35,58,65,61,44,36,35,33,29,17,10,8,7,5,2,0,0,5,8,
+14,16,19,21,36,51,86,128,100,85,88,134,155,76,51,59,99,148,143,177,221,192,177,213,248,253,243,248,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,238,154,79,
+31,14,9,19,23,30,47,43,24,9,14,17,21,20,40,88,111,98,104,127,94,95,127,125,62,24,19,70,137,173,168,186,170,141,139,130,139,132,154,210,227,183,179,189,241,255,255,250,
+247,242,219,225,255,255,255,255,255,255,249,234,220,227,212,193,179,208,222,220,217,204,176,133,130,165,175,164,164,129,95,66,43,31,24,22,17,21,27,29,21,14,15,15,16,16,19,22,
+28,43,72,71,56,57,59,66,76,66,58,55,57,54,50,45,42,38,36,33,34,35,36,35,33,27,22,17,15,15,16,17,17,21,21,16,15,20,26,24,22,29,40,48,56,69,80,108,
+136,144,118,92,76,70,63,58,55,54,54,55,48,43,36,30,26,26,22,21,23,24,27,30,34,34,34,34,33,28,28,31,29,27,28,27,22,22,17,7,3,1,6,7,10,20,33,40,
+42,31,22,28,31,31,19,12,12,8,6,3,0,0,2,7,12,14,15,14,20,33,43,66,78,62,54,72,122,78,45,72,92,129,190,245,234,183,184,199,248,255,242,227,248,255,254,255,
+255,255,255,255,255,255,255,255,255,255,255,254,254,255,246,208,111,38,35,28,16,29,55,35,17,14,15,20,28,36,62,93,128,165,190,204,141,112,139,129,65,27,27,84,129,157,170,170,
+133,90,83,88,101,105,162,218,211,167,172,185,207,229,236,234,231,210,176,176,233,253,255,255,255,255,254,222,183,185,164,158,167,196,232,219,214,194,169,171,187,176,185,172,136,109,77,44,
+27,24,21,19,15,16,24,16,9,7,12,20,20,17,17,21,27,40,44,47,44,43,44,50,56,55,47,47,49,47,42,40,37,35,34,33,33,34,33,30,29,30,27,23,19,16,15,15,
+19,24,21,12,9,6,2,0,5,10,22,31,44,69,111,137,140,144,104,77,70,59,54,51,50,48,47,43,37,33,28,21,19,16,12,9,9,15,22,28,34,36,36,34,33,30,30,30,
+29,27,23,20,15,12,10,8,3,3,3,8,14,21,36,50,47,34,21,19,19,19,17,17,20,15,10,5,1,0,6,12,10,14,15,14,17,20,22,33,57,62,52,49,106,115,64,64,
+79,105,175,252,253,240,233,221,227,255,255,232,239,253,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,247,239,162,126,139,28,5,15,23,22,20,19,17,24,31,43,68,104,
+132,150,170,191,155,98,114,109,48,23,41,93,126,158,160,162,120,88,71,66,72,92,137,163,156,165,162,165,180,196,210,212,197,157,151,158,158,194,254,255,255,254,252,226,199,187,193,197,
+189,200,228,225,220,185,164,186,203,203,198,163,123,113,69,43,24,17,19,20,17,19,22,13,6,15,22,28,24,17,16,20,27,34,34,36,45,55,58,57,54,44,41,36,38,38,37,31,
+29,28,29,31,33,29,30,35,42,40,36,33,20,14,10,13,17,28,27,13,6,0,0,0,0,0,9,28,50,80,76,58,50,55,45,42,41,37,37,38,38,36,37,36,34,30,24,21,
+15,12,5,0,1,10,20,27,31,35,36,35,34,30,31,33,33,28,22,17,12,12,14,14,13,13,15,24,28,37,54,57,51,43,19,9,14,17,22,29,33,28,21,9,6,8,13,13,
+14,15,15,14,14,13,16,22,45,70,61,51,78,97,73,71,86,104,169,235,252,255,254,233,197,221,245,255,247,243,250,247,231,249,255,255,255,255,255,255,255,255,255,255,255,255,255,235,
+176,150,137,54,3,6,15,12,14,19,48,63,57,68,85,127,144,130,143,175,130,86,108,91,37,31,54,92,125,148,173,165,105,91,72,59,61,75,100,112,116,154,162,154,164,172,187,194,
+168,120,129,134,121,211,255,255,255,255,248,241,240,241,238,224,213,218,226,229,219,165,162,178,197,208,193,158,139,115,79,59,30,22,26,29,26,27,26,15,20,28,26,28,28,24,22,28,
+42,35,29,36,59,79,79,78,62,38,31,23,23,26,28,27,24,23,27,29,30,33,35,50,56,40,42,41,22,8,5,8,23,51,44,8,1,0,0,0,0,6,26,50,84,100,41,24,
+24,22,21,21,19,21,22,23,26,28,30,31,33,31,27,21,16,8,2,0,0,7,14,24,33,35,37,38,38,34,34,35,33,29,23,17,14,12,10,10,13,14,19,24,30,42,49,61,
+73,52,24,13,19,20,27,40,56,49,33,19,13,15,16,20,19,16,15,14,12,8,12,19,29,49,58,71,78,90,86,99,140,144,169,193,199,228,255,217,186,198,196,232,240,232,214,200,
+191,239,255,255,255,255,255,255,255,255,255,255,255,255,255,253,167,87,72,63,26,16,20,17,31,59,99,113,102,78,83,132,156,136,121,128,100,84,101,61,24,34,57,90,120,149,160,119,
+88,91,91,76,54,47,85,104,135,197,168,142,127,125,164,177,146,120,143,126,130,229,255,252,253,248,250,248,242,241,253,235,215,214,215,228,197,176,184,187,186,171,146,134,130,115,100,70,
+42,36,51,56,47,48,44,36,30,27,22,29,35,33,33,43,64,45,33,40,62,71,79,78,61,43,29,22,19,19,19,26,31,28,34,38,37,41,42,52,45,33,38,43,33,13,6,12,
+57,95,51,10,1,1,0,0,0,12,24,45,68,76,50,28,22,19,16,14,10,13,15,17,19,22,24,28,31,31,29,21,14,6,0,0,0,6,12,21,31,36,37,40,40,38,37,34,
+34,29,26,22,17,13,9,6,6,7,10,17,34,50,55,87,97,52,40,23,24,26,28,43,71,77,55,33,26,23,22,24,24,21,17,10,7,5,7,13,23,37,45,58,75,99,107,120,
+179,199,193,178,156,196,254,233,221,229,198,207,221,226,178,151,177,222,246,247,254,255,255,255,255,255,255,255,254,254,254,236,162,79,41,21,28,27,15,30,66,94,115,116,104,73,91,136,
+150,127,118,115,92,83,99,55,28,37,59,91,123,146,121,98,123,135,127,94,63,50,86,115,149,197,146,113,101,84,105,113,86,93,121,127,134,184,221,242,228,240,255,241,225,224,246,250,
+232,219,221,236,193,187,186,176,186,183,139,132,144,130,120,104,68,52,84,86,83,82,72,54,34,23,24,27,26,28,29,35,41,37,40,45,56,71,68,64,56,48,35,29,22,20,23,29,
+35,33,35,43,43,41,38,38,35,34,38,37,31,24,16,56,109,78,31,16,9,14,13,7,9,8,8,16,36,54,50,29,24,19,14,12,9,10,13,14,14,15,17,23,28,29,28,21,
+12,6,1,0,0,5,13,22,31,37,40,41,42,40,38,35,33,27,24,23,19,10,6,2,1,2,6,14,23,29,50,69,59,36,49,38,33,33,34,42,63,72,57,40,33,30,30,33,
+33,29,20,9,5,2,2,10,22,34,36,45,59,83,129,163,201,217,213,183,158,198,255,255,254,249,239,218,227,231,162,156,186,193,220,239,254,255,255,255,255,255,255,255,254,250,249,236,
+144,70,42,15,19,22,20,35,62,86,106,107,95,104,132,143,132,99,98,118,87,72,70,63,48,49,69,86,83,72,63,84,118,120,123,99,70,82,114,111,153,139,91,91,88,61,59,63,
+72,75,128,197,179,177,205,233,238,255,243,201,197,225,248,254,254,254,254,247,211,206,196,186,196,190,144,137,137,121,141,178,132,90,97,102,92,87,100,80,44,28,23,24,22,24,27,31,
+29,30,40,69,100,99,108,98,52,36,36,31,27,23,27,31,31,27,30,44,45,33,28,31,40,51,48,38,42,52,58,102,118,82,55,44,36,44,31,12,5,0,1,3,14,30,34,26,
+15,8,9,13,10,10,9,7,6,6,10,21,27,33,29,24,16,8,7,6,5,9,17,23,31,38,43,41,43,41,40,37,34,28,23,21,19,14,5,0,2,6,6,5,0,2,21,23,
+13,21,51,54,49,44,43,50,57,54,49,41,36,34,36,40,40,35,24,14,6,2,1,10,24,33,36,42,45,65,119,189,226,206,221,217,180,190,248,254,255,255,255,248,249,226,173,137,
+165,205,221,232,253,255,254,255,255,255,254,253,255,253,249,255,160,42,30,15,19,29,15,26,44,66,102,111,123,121,128,147,146,128,125,111,97,86,69,107,102,79,82,85,76,75,58,57,
+72,78,86,98,86,88,90,87,118,78,58,92,86,59,62,68,91,108,147,180,184,191,199,247,255,255,214,192,218,229,245,252,252,255,255,249,229,217,203,178,191,185,157,164,163,175,186,196,
+197,189,193,187,122,133,151,127,65,34,24,22,17,20,33,30,22,24,49,88,133,129,143,136,78,35,35,41,36,19,22,28,30,34,36,50,52,29,27,48,64,63,47,44,62,86,123,140,
+106,76,62,61,58,61,47,35,21,7,16,9,5,16,19,12,17,28,28,21,13,10,6,0,0,0,3,14,24,33,34,29,21,13,12,10,10,15,17,27,31,38,41,42,42,41,41,37,
+35,31,24,20,17,15,8,3,2,6,1,0,0,0,2,0,5,28,55,66,75,59,49,56,57,40,34,35,36,37,40,43,49,41,30,19,10,5,2,9,24,35,36,49,65,88,120,184,
+224,219,222,218,212,190,234,252,255,255,255,252,221,196,175,123,129,190,238,231,234,252,254,255,255,255,254,240,239,243,241,220,205,100,33,22,22,16,13,37,59,79,100,115,135,113,132,147,
+139,112,114,92,93,114,135,175,164,147,143,119,83,56,42,40,44,54,63,73,63,58,62,64,63,51,61,95,85,73,70,80,93,102,151,190,160,165,176,229,235,203,157,165,203,243,241,250,
+248,249,232,225,213,194,167,151,198,199,184,177,199,211,194,186,200,212,218,205,150,113,137,115,48,27,24,23,23,22,23,30,37,45,65,97,115,116,137,127,78,43,45,62,51,34,31,42,
+68,78,70,82,56,34,71,101,101,72,52,45,66,144,165,156,125,80,64,58,55,56,100,126,87,66,56,26,16,52,45,50,79,75,55,47,26,12,0,0,0,0,0,7,20,29,34,31,
+21,16,14,17,17,17,20,27,35,37,40,42,42,41,40,37,33,30,22,17,14,12,9,6,5,3,0,0,0,0,0,0,0,33,62,84,98,90,76,68,51,30,22,28,33,36,40,45,
+52,47,34,22,16,13,12,14,23,31,40,62,111,158,170,180,194,200,219,203,190,178,214,243,255,255,254,228,187,173,163,141,90,143,232,226,218,253,255,255,255,255,235,183,149,208,235,178,
+193,144,69,77,44,24,50,72,80,95,113,122,134,137,158,160,146,120,119,123,147,161,175,178,167,165,160,132,85,55,41,35,34,40,55,65,56,55,50,44,42,51,64,69,88,123,121,115,
+142,123,146,167,133,137,154,169,162,196,210,198,220,253,248,239,228,213,205,180,153,147,137,149,189,211,182,156,201,218,204,190,186,178,190,193,141,107,128,98,43,24,21,21,38,31,21,33,
+62,80,85,91,116,140,129,85,59,43,36,54,41,56,108,136,143,116,84,90,91,116,156,147,129,83,77,73,91,154,162,172,178,149,90,69,62,43,90,137,112,116,104,54,64,114,122,125,
+97,68,54,42,23,3,0,0,0,0,0,5,17,26,30,29,22,20,20,20,21,20,23,30,35,38,41,42,41,38,38,37,31,26,20,15,15,14,16,13,12,5,0,0,0,0,0,0,
+0,17,56,102,118,113,101,73,47,30,20,23,28,34,41,48,55,52,42,35,29,23,23,20,26,34,43,63,129,172,206,197,164,136,168,178,161,144,157,212,250,254,253,196,193,198,180,162,
+100,106,197,239,247,255,255,255,255,252,217,200,157,199,228,164,187,169,112,133,102,101,116,85,49,88,140,126,128,144,149,150,140,157,153,171,192,192,189,162,149,164,164,128,88,68,50,37,
+35,41,57,65,57,50,49,45,51,61,65,85,129,149,200,177,175,132,137,139,113,132,156,144,168,226,255,255,255,253,241,224,206,164,170,151,113,129,149,162,168,162,132,129,190,212,217,219,
+199,168,163,171,119,107,121,84,45,31,24,30,49,33,23,41,65,94,83,98,120,130,114,91,69,33,37,61,44,78,175,214,168,120,94,86,108,148,160,156,143,93,87,108,125,146,147,165,
+198,172,135,108,61,57,108,154,150,136,136,90,82,98,80,68,56,37,24,9,0,0,0,0,0,0,0,0,12,22,28,28,26,24,24,21,21,22,27,36,38,38,42,43,42,41,40,35,
+37,33,26,19,17,17,21,17,13,8,0,0,0,0,0,0,0,23,73,101,112,105,70,57,44,31,26,26,31,37,47,52,57,63,68,61,52,43,34,29,30,41,61,69,115,170,210,192,
+149,130,155,175,142,125,128,161,207,252,249,186,189,215,218,198,98,76,150,228,255,255,255,253,252,247,235,226,179,205,219,176,203,204,141,141,155,158,144,73,51,69,133,142,135,130,132,127,
+157,187,193,203,187,191,189,140,122,162,171,130,101,85,63,41,36,37,38,44,43,41,51,59,77,82,87,109,165,179,225,191,161,142,125,121,113,130,168,177,167,233,255,224,192,178,154,148,
+151,157,157,116,115,151,157,178,167,127,142,141,171,220,228,226,198,163,150,135,115,114,119,76,55,47,44,63,66,45,52,90,120,112,95,126,136,139,128,95,58,38,50,62,65,77,129,190,
+171,146,125,90,125,167,186,207,182,114,133,141,154,156,151,164,171,172,189,143,111,121,165,178,164,143,126,91,43,19,27,34,34,19,9,0,0,0,0,0,0,0,0,0,8,20,28,30,
+29,26,27,22,21,26,33,44,43,37,40,44,43,43,43,40,43,37,30,26,20,20,22,15,9,6,0,0,0,0,6,3,9,30,64,88,94,85,57,47,40,28,24,26,35,43,45,55,
+69,90,106,93,80,59,37,30,31,48,75,91,116,129,170,214,177,169,176,142,107,111,107,120,192,242,235,208,187,212,204,154,71,59,127,220,252,255,253,247,246,245,239,226,215,220,208,199,
+200,171,141,129,158,169,133,107,100,112,130,133,136,129,128,143,170,203,206,197,198,196,201,190,182,190,167,139,113,95,68,42,30,26,26,33,38,45,54,61,69,76,91,123,212,245,241,218,
+212,228,205,176,130,150,184,208,226,249,249,183,146,146,143,154,153,125,88,58,76,100,158,207,186,147,147,165,201,233,232,206,143,108,134,137,111,113,123,107,66,59,70,97,77,72,104,156,
+170,135,122,163,190,172,146,92,78,72,63,45,44,100,168,182,196,194,171,170,207,207,197,198,204,163,168,137,142,139,133,140,148,172,201,192,187,200,191,179,167,137,99,61,22,6,7,9,
+12,7,0,0,0,0,0,0,0,0,0,2,13,22,30,31,29,29,28,26,29,36,44,51,43,36,40,42,43,43,44,45,45,41,40,42,40,29,26,26,16,9,3,3,7,10,13,17,
+27,36,61,93,97,78,50,41,34,23,24,27,35,41,50,71,100,119,132,129,107,71,41,30,37,56,72,106,143,125,99,204,200,199,163,94,105,102,85,114,189,217,182,148,143,185,184,161,
+126,84,126,186,210,211,228,235,233,236,233,242,233,205,200,190,186,163,143,147,162,168,150,135,142,150,142,123,122,132,141,157,170,193,196,199,240,242,248,249,238,205,163,137,109,85,58,38,
+27,21,26,34,41,48,58,68,72,73,85,139,231,255,255,217,158,175,177,142,123,99,94,163,245,248,218,156,141,147,170,171,184,137,82,55,65,63,125,190,186,140,132,175,211,229,221,191,
+136,116,149,164,134,111,106,114,87,63,77,107,91,106,111,155,187,177,164,201,179,135,111,109,118,91,58,37,56,180,240,233,248,245,235,255,238,194,183,176,194,175,194,189,137,87,88,147,
+141,171,200,200,211,208,193,128,135,126,57,17,0,1,8,6,1,0,0,0,0,0,0,0,0,0,0,2,15,27,33,33,31,31,31,30,35,48,58,56,43,37,40,41,43,44,45,44,
+44,42,48,50,56,45,35,49,34,14,16,24,26,16,15,29,43,64,95,122,101,70,47,35,31,23,27,30,37,44,57,86,135,156,151,148,129,86,50,35,49,79,101,128,158,162,150,194,
+206,192,121,84,101,100,93,126,176,201,189,169,151,142,147,156,161,126,114,160,172,182,220,229,219,232,233,235,228,194,215,217,198,199,177,173,169,163,130,118,149,167,160,146,147,157,157,162,
+178,193,187,219,255,255,255,255,254,221,168,134,102,73,51,40,31,28,31,40,47,57,69,83,84,79,82,123,205,252,229,175,121,102,112,102,91,68,62,135,183,158,130,104,132,182,194,186,
+177,121,51,44,63,78,136,173,194,196,193,185,197,206,197,191,177,179,197,182,150,139,151,172,153,128,137,118,85,77,84,133,204,217,212,193,137,107,105,116,101,77,55,41,114,238,246,254,
+255,255,250,249,246,236,233,217,197,186,196,172,130,128,169,169,143,186,190,180,190,194,162,72,87,93,33,8,2,3,9,2,0,0,0,0,0,0,0,0,0,0,0,5,16,28,35,36,
+37,35,37,40,40,47,51,47,40,37,41,41,45,45,47,47,42,41,42,44,55,59,42,50,57,36,43,62,62,42,28,47,68,85,112,120,86,57,42,33,28,29,31,35,41,48,59,88,
+144,185,194,190,157,104,63,47,59,91,121,143,182,207,182,191,226,218,149,127,106,94,109,111,147,189,182,169,170,148,132,137,137,120,129,163,179,187,227,232,225,227,229,236,227,204,206,220,
+198,198,194,154,140,146,121,134,167,168,161,161,154,156,158,161,168,172,170,226,255,255,255,255,255,233,179,139,109,79,59,55,45,40,38,45,57,71,80,88,88,88,100,149,193,219,175,167,
+121,101,134,126,85,88,119,144,123,88,73,83,134,186,176,171,125,57,30,41,65,90,167,183,206,215,191,170,191,204,201,184,165,161,172,158,161,169,191,194,186,192,201,184,118,109,137,127,
+210,233,205,197,169,139,113,98,80,94,128,115,213,255,253,255,255,255,252,250,248,214,193,189,205,196,170,163,179,176,178,113,123,173,189,148,155,169,139,94,66,35,13,6,6,5,3,0,
+0,0,0,0,0,0,0,0,0,0,0,6,19,30,38,42,42,41,41,43,41,45,49,47,43,42,42,42,43,45,47,45,41,37,37,38,50,70,66,61,71,68,76,114,111,129,101,76,
+86,90,98,97,77,56,43,35,33,35,38,41,47,54,76,105,150,199,231,229,196,128,77,61,79,105,133,164,179,218,206,212,233,235,187,132,136,123,139,132,132,161,170,158,172,167,175,150,
+104,99,149,163,164,157,199,225,225,235,219,215,218,222,197,200,206,198,178,164,136,146,167,163,171,165,161,162,134,127,153,120,85,118,144,208,255,255,255,255,255,240,196,149,118,91,77,71,
+62,54,48,51,59,73,85,108,162,211,225,250,250,213,157,126,102,93,101,101,84,77,95,98,92,73,66,97,122,146,160,143,82,38,21,36,52,98,177,193,191,198,196,193,210,225,212,175,
+156,162,167,185,191,193,196,189,185,197,204,205,199,221,226,222,250,250,240,239,219,185,130,92,104,193,240,238,253,254,255,255,255,254,253,254,252,162,137,168,199,228,221,217,205,176,125,76,
+123,142,149,91,84,141,143,106,50,23,12,3,2,2,8,9,0,0,0,0,0,0,0,0,0,1,5,9,20,34,45,50,49,49,50,52,54,55,56,52,48,45,43,44,45,48,47,45,
+41,36,36,36,43,69,94,94,82,86,104,137,148,153,107,97,93,91,100,82,63,51,44,42,45,44,47,44,49,63,95,127,182,239,248,219,173,134,98,90,123,177,173,163,173,225,226,225,
+242,245,224,147,108,114,154,183,189,179,182,170,170,189,199,178,111,100,125,118,125,135,197,213,198,221,211,176,213,229,200,187,212,179,168,194,199,193,192,179,170,161,155,135,88,92,86,47,
+43,79,116,172,249,252,255,255,254,252,225,184,137,106,104,115,95,66,58,62,77,88,95,125,180,250,247,242,242,225,182,111,91,77,72,69,66,62,52,64,77,68,66,79,85,115,135,102,
+49,35,21,27,55,128,175,185,183,196,224,207,207,213,197,165,178,184,185,210,206,210,197,158,163,205,231,238,249,249,253,255,255,255,253,246,242,248,225,179,190,253,255,255,254,254,255,255,
+255,255,255,254,248,193,184,226,219,239,234,234,219,147,115,136,163,107,116,109,84,111,104,61,41,28,13,8,6,8,13,17,6,0,0,0,0,0,0,0,1,9,12,14,23,34,43,50,
+50,52,58,64,64,62,61,54,49,45,43,44,44,48,48,48,41,37,33,30,43,76,91,90,85,95,123,165,192,161,78,75,77,93,111,82,69,51,47,50,56,56,55,55,66,80,98,148,
+185,222,243,229,184,144,125,123,163,212,206,172,186,232,241,232,240,245,228,142,75,66,146,204,189,173,180,173,157,201,197,171,160,137,104,78,77,140,213,208,203,221,219,184,211,232,222,197,
+201,180,173,187,199,217,206,193,172,120,119,94,59,41,12,13,27,55,118,164,185,190,219,254,253,248,228,208,179,149,140,178,143,79,71,94,150,175,122,109,130,141,172,193,184,175,151,99,
+86,77,72,75,93,86,64,62,58,75,77,79,94,116,106,80,45,29,23,29,66,136,187,207,222,239,220,197,203,184,150,167,207,222,215,213,200,205,199,165,183,241,252,249,254,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,243,215,229,239,232,232,227,217,197,197,211,191,135,139,111,102,102,77,42,36,23,14,10,10,14,15,19,
+9,0,0,0,0,0,0,0,2,14,23,21,24,33,41,43,47,55,59,61,64,64,58,55,51,48,48,48,48,50,50,47,42,36,30,30,40,57,76,79,72,90,120,172,204,168,90,69,
+70,97,102,73,62,56,54,58,63,69,80,88,109,128,134,179,208,211,241,239,211,182,151,191,205,192,219,197,205,212,242,241,219,218,235,164,77,66,111,170,170,143,141,133,129,183,191,179,
+172,151,107,85,92,162,212,211,206,220,229,211,214,217,226,227,200,198,201,198,196,220,228,218,183,116,86,61,41,16,21,26,30,57,120,154,129,160,208,242,254,234,200,184,179,190,200,222,
+167,107,108,167,176,169,127,120,133,134,160,186,141,129,121,93,77,76,72,91,127,113,83,91,93,127,105,93,99,79,55,44,33,24,30,49,95,150,213,222,228,231,201,200,211,161,177,191,
+173,218,215,214,227,224,228,232,247,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,247,245,234,231,220,227,220,213,214,
+207,170,142,113,108,104,88,59,47,31,17,10,10,9,8,12,7,0,0,0,0,0,0,0,2,17,28,28,28,31,36,40,45,52,57,61,63,61,56,55,54,50,51,50,50,49,50,47,
+37,34,27,30,35,37,49,62,57,59,88,134,176,170,119,88,95,101,86,69,61,65,66,64,69,76,93,119,147,164,167,189,220,213,228,228,222,207,210,255,243,201,200,218,229,219,235,235,
+226,232,240,199,106,88,111,143,169,156,134,125,113,140,148,163,160,156,113,97,126,187,206,199,189,189,187,204,224,228,235,228,196,194,229,212,189,217,233,232,210,160,98,42,20,19,30,33,
+49,70,99,118,148,196,203,229,242,229,200,176,156,168,190,231,238,217,231,235,165,160,142,162,176,196,182,150,129,146,127,95,80,80,88,125,151,125,141,164,134,119,90,87,79,58,35,28,
+26,29,38,76,118,155,184,185,176,185,199,225,233,184,187,163,162,207,219,235,253,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,253,248,232,215,214,221,213,220,222,211,194,169,128,115,125,134,86,47,29,21,22,10,9,10,6,0,0,0,0,0,0,0,0,0,15,30,30,31,34,36,41,
+49,55,55,57,54,50,49,50,51,51,54,51,51,47,45,44,31,28,27,29,35,40,37,42,36,36,62,104,148,128,97,100,129,112,72,75,76,75,76,76,75,78,101,135,153,190,189,191,
+236,226,221,204,205,207,233,255,255,238,215,255,255,254,250,247,238,234,241,214,151,133,180,206,211,173,140,140,113,121,109,135,168,160,126,128,161,197,208,196,155,137,156,168,224,241,243,236,
+220,212,222,196,196,219,227,224,218,171,61,19,15,22,42,45,48,72,101,109,150,177,185,217,226,203,199,186,168,126,128,228,255,255,255,252,242,227,219,213,196,193,160,113,126,162,129,93,
+84,87,113,154,190,173,175,146,88,64,64,82,65,48,36,31,30,30,44,69,101,137,142,162,155,169,190,177,196,191,154,148,180,217,217,247,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,249,232,217,218,221,228,228,232,214,204,197,173,155,148,147,97,34,10,19,28,9,16,19,7,
+2,1,0,0,0,0,0,0,0,14,36,40,37,38,42,43,47,51,54,55,52,49,45,49,50,52,52,51,49,45,44,37,29,27,29,29,33,35,40,41,30,31,49,87,132,94,75,87,
+102,108,78,73,82,76,76,79,79,86,114,153,164,200,197,206,214,218,205,189,199,213,227,247,255,255,255,255,255,255,255,254,255,243,227,217,206,201,218,238,235,213,156,149,128,141,150,136,
+151,146,118,118,136,167,197,178,128,127,155,168,210,241,240,243,235,224,217,187,206,221,226,217,199,136,29,14,22,50,59,51,42,71,105,149,171,177,199,163,155,154,183,198,179,132,144,232,
+250,255,255,248,245,241,198,201,192,146,105,97,107,107,100,88,91,108,121,163,225,215,178,105,71,66,75,70,54,41,36,36,31,27,37,54,73,112,126,128,154,176,165,125,119,187,158,149,
+168,200,200,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,227,185,207,214,218,226,227,
+224,217,212,197,170,141,115,79,36,6,17,36,24,26,24,9,3,0,0,0,0,0,0,0,0,15,44,49,43,38,41,42,43,43,48,56,55,51,48,47,49,50,49,50,47,45,38,31,
+28,27,27,28,31,38,42,43,37,40,52,90,106,87,77,76,84,98,99,82,76,73,78,82,88,94,119,150,170,192,191,199,179,189,167,178,201,218,233,229,253,255,255,255,255,255,255,254,
+255,253,224,212,215,233,239,236,229,225,196,186,161,179,153,122,137,129,84,78,100,127,167,161,127,127,137,150,178,233,240,245,242,219,199,183,219,231,232,221,194,118,23,23,35,50,55,48,
+47,82,107,162,213,175,172,135,113,136,161,178,153,128,158,182,172,218,242,254,249,254,211,178,162,125,105,99,108,114,105,105,119,149,129,182,238,211,160,102,79,77,82,62,47,38,36,36,
+31,26,31,48,62,85,99,101,144,154,122,99,108,158,165,133,134,169,180,232,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,253,253,255,255,255,205,146,198,203,197,192,193,214,218,206,167,146,125,87,55,35,19,19,30,51,38,26,19,7,0,0,0,0,0,0,0,0,10,40,47,41,38,38,42,
+42,41,43,51,54,52,52,49,50,50,52,49,44,41,36,30,26,21,26,28,31,34,42,48,49,50,72,95,71,71,83,68,83,85,97,113,91,75,77,84,92,99,114,134,140,157,176,185,
+173,200,163,171,203,226,240,249,255,255,255,255,255,255,255,255,255,248,235,212,210,242,238,232,234,227,219,220,206,218,161,107,113,93,62,72,82,99,134,134,121,132,140,162,206,236,234,246,
+247,224,198,211,233,243,245,229,200,125,34,56,71,59,48,52,77,111,150,189,191,151,140,123,115,111,126,132,122,106,112,119,136,165,226,255,255,255,240,184,162,144,133,109,100,101,125,149,
+157,172,169,186,182,143,115,115,94,73,62,43,35,30,29,28,24,19,22,31,43,56,66,80,102,98,85,86,104,128,134,104,109,137,177,214,243,238,249,255,255,255,255,255,255,255,255,255,
+255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,243,218,240,255,252,205,158,187,203,203,173,156,175,187,194,160,157,134,92,30,16,7,7,23,40,35,21,7,
+0,0,0,0,0,0,0,0,0,5,30,42,44,41,38,41,41,41,43,48,52,56,54,51,50,51,52,49,45,43,36,31,23,20,23,24,31,41,37,49,66,72,104,86,48,43,54,49,
+55,64,83,115,105,78,78,82,88,95,102,125,132,144,170,175,192,222,189,189,210,239,252,255,255,255,255,255,255,255,255,255,255,255,250,235,232,241,240,229,241,232,198,208,219,218,167,116,
+105,126,105,73,63,69,99,125,113,102,112,179,234,231,225,242,248,231,224,235,246,252,252,239,207,116,47,109,127,63,35,49,85,120,163,184,164,143,120,116,165,137,105,108,115,107,80,101,
+127,154,240,255,255,255,233,173,185,182,157,129,123,115,151,179,162,149,175,190,144,130,151,140,84,51,37,31,24,20,21,17,17,16,17,26,31,38,49,66,85,100,101,101,121,122,109,93,
+102,147,204,218,213,217,238,255,255,255,255,255,254,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,248,243,233,224,234,227,212,191,165,180,201,196,169,153,
+168,169,179,165,161,149,105,55,9,3,10,26,33,24,12,0,0,0,0,0,0,0,0,0,0,2,22,36,42,40,41,38,35,48,50,52,57,57,57,55,51,52,50,47,45,42,35,29,
+26,22,22,23,43,54,44,69,85,95,121,80,40,44,45,34,35,55,72,86,88,76,76,83,90,100,106,109,108,115,154,164,191,227,207,215,225,227,253,255,255,255,255,255,255,255,255,255,
+255,255,252,253,242,235,238,238,243,239,186,163,191,217,155,156,171,180,146,70,49,44,71,119,123,101,98,178,231,194,190,224,241,243,242,248,254,255,254,246,210,123,68,120,133,49,31,45,
+62,86,112,126,157,142,115,144,180,157,135,125,121,91,72,93,100,118,206,255,255,245,211,204,206,168,149,139,134,137,149,153,136,147,183,208,167,149,134,100,58,37,30,22,15,12,10,12,
+13,15,19,24,34,44,59,73,94,134,120,119,148,154,123,106,121,162,198,214,219,231,243,253,255,255,255,254,250,252,250,248,248,254,255,255,255,255,255,255,254,255,255,255,255,255,255,255,
+255,253,239,232,238,235,201,149,135,150,164,189,211,201,183,173,179,183,182,156,132,109,59,36,9,3,12,26,23,28,10,0,0,0,0,0,0,0,0,0,0,2,16,30,44,47,51,48,
+49,54,52,54,58,58,57,54,54,52,54,49,44,40,35,29,28,26,22,30,56,55,52,92,136,126,101,61,37,49,49,42,40,50,59,63,65,71,80,92,107,120,135,134,119,105,128,142,
+191,236,215,228,234,243,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,238,234,243,249,247,215,172,163,215,199,210,249,194,123,80,51,43,63,97,127,120,100,171,211,164,161,201,
+236,248,249,253,255,255,255,245,214,176,119,132,147,73,50,66,82,99,95,95,118,113,122,158,176,176,194,173,149,95,78,87,92,95,148,201,246,243,185,205,191,157,141,115,104,111,122,123,
+129,123,140,177,175,158,107,64,42,27,21,15,7,3,3,6,7,14,22,33,44,64,84,106,119,141,126,142,156,163,153,135,148,184,201,204,219,234,245,252,254,255,254,253,249,243,241,247,
+239,247,254,255,255,255,255,249,246,255,255,255,255,255,255,253,249,241,207,210,204,163,122,118,126,126,180,199,196,189,201,203,194,207,197,167,120,63,29,12,6,5,16,31,36,41,21,0,
+0,5,0,0,0,0,0,0,0,6,15,27,41,51,52,54,56,54,52,55,57,56,56,56,55,56,56,52,49,41,34,29,37,35,41,58,78,73,71,106,132,135,128,64,27,40,45,56,
+58,62,64,62,59,66,86,102,129,157,177,158,154,151,142,142,192,232,241,235,232,239,250,254,255,255,255,255,255,255,255,255,255,255,255,255,252,233,236,240,248,249,234,199,208,221,219,222,
+224,160,108,105,84,73,69,85,118,140,119,134,165,162,171,208,234,243,249,254,255,255,255,243,213,180,164,143,116,83,59,69,73,72,52,73,80,111,162,141,129,183,198,175,141,94,80,78,
+83,91,98,133,227,233,158,161,169,141,112,93,88,86,88,105,125,100,92,107,144,133,86,44,27,21,15,9,2,1,0,3,5,15,26,36,59,84,107,154,129,156,176,186,180,197,197,175,
+169,190,217,229,238,242,245,243,242,240,243,243,246,248,239,239,239,246,255,255,250,241,239,227,236,254,255,255,255,255,255,247,236,227,214,208,192,163,170,191,167,161,199,213,199,194,207,213,
+180,176,170,144,92,42,41,31,13,28,34,33,36,35,14,3,0,0,0,0,0,0,0,0,0,2,10,19,28,47,48,47,47,50,49,49,52,55,54,54,54,54,56,56,54,45,43,37,
+61,57,72,100,121,122,133,158,133,126,149,82,28,47,65,87,95,85,77,64,63,71,91,116,143,165,192,187,193,190,167,176,203,231,242,234,228,239,235,235,254,255,255,255,255,255,255,255,
+255,255,255,249,245,232,211,213,232,238,229,180,183,171,192,140,99,120,140,137,130,107,72,76,120,160,136,118,127,122,151,185,219,241,250,255,255,255,255,240,214,179,172,163,92,48,54,57,
+65,48,27,47,86,140,161,147,139,136,146,180,153,85,76,80,85,93,92,115,178,178,139,141,133,106,92,83,83,84,83,95,102,94,83,80,98,87,50,27,20,16,7,2,0,0,0,1,
+5,13,27,45,83,92,120,198,192,213,227,206,185,185,186,173,173,194,226,247,250,250,245,234,225,228,227,229,241,245,226,227,234,224,227,219,215,217,213,220,232,246,254,255,255,255,255,253,
+247,232,231,224,214,219,221,240,225,214,219,213,212,219,213,214,191,136,125,114,54,16,34,29,19,31,34,31,37,26,5,5,2,0,0,0,0,0,3,3,0,0,5,9,16,28,36,33,
+36,43,42,43,44,49,49,49,50,50,52,62,58,61,75,68,91,88,86,109,130,148,192,227,183,149,100,75,40,65,92,109,99,90,86,62,66,105,133,132,142,176,204,206,218,214,197,183,
+175,208,219,232,220,233,243,243,252,255,255,255,255,255,255,255,255,255,255,231,229,234,208,196,207,233,236,175,98,118,132,107,133,184,186,173,161,100,68,75,113,129,134,122,87,88,125,156,
+193,231,249,255,255,255,254,234,210,196,194,200,153,70,41,43,42,21,17,31,64,136,121,119,97,113,116,164,139,82,87,99,105,98,88,102,133,135,135,118,105,102,92,80,83,87,90,99,
+101,88,73,68,66,50,31,21,16,10,2,0,0,0,0,2,7,14,29,57,88,97,126,186,235,231,234,215,189,189,204,206,217,228,242,254,254,249,243,229,213,210,203,199,206,197,191,194,
+198,186,176,158,162,191,210,225,233,232,238,253,255,255,255,255,249,242,240,238,236,233,231,240,243,233,222,206,214,219,221,222,194,140,146,93,35,10,9,14,20,23,33,44,41,14,6,14,
+13,7,0,0,0,0,5,6,5,1,1,2,3,12,17,22,24,31,36,37,37,37,41,43,44,44,44,59,69,76,95,99,119,127,108,121,163,191,204,212,189,128,78,85,70,79,109,137,
+133,107,95,72,70,114,161,164,167,201,224,215,218,231,218,170,135,161,197,220,219,221,239,248,253,255,255,255,255,255,254,254,255,255,250,198,217,217,206,213,214,238,246,169,88,113,136,150,
+207,219,199,167,130,77,66,75,98,97,109,111,79,86,108,111,132,197,247,255,255,255,250,227,205,205,206,206,178,112,71,50,26,14,22,30,34,54,59,76,78,93,106,109,93,87,86,97,
+107,109,94,97,97,102,112,107,113,126,98,82,88,91,91,97,95,80,65,59,52,41,28,21,12,6,0,0,0,0,5,12,15,20,31,51,70,111,147,172,233,222,208,211,225,228,226,235,
+248,254,255,255,255,253,243,226,217,190,176,175,171,163,168,180,183,168,175,155,157,187,217,228,240,238,246,255,255,255,255,254,253,252,250,250,243,233,236,240,243,238,221,213,212,208,227,221,
+203,194,161,79,40,14,9,21,29,22,36,61,33,15,20,16,10,7,1,0,0,17,19,3,6,5,7,5,5,12,12,16,13,15,21,24,29,31,31,34,37,36,36,48,84,111,120,109,
+154,123,102,136,183,199,199,184,144,93,72,88,115,108,123,169,161,116,84,75,75,95,147,179,198,199,211,224,227,206,211,200,146,121,167,190,210,240,246,254,255,255,255,255,255,252,246,254,
+255,255,250,221,224,176,183,194,226,247,240,153,116,129,192,205,198,180,168,113,92,78,63,64,88,94,95,80,76,71,77,106,153,205,253,254,254,254,245,224,212,204,208,206,177,146,112,62,
+24,17,22,31,21,21,58,71,65,58,93,83,78,75,71,78,99,104,87,86,85,93,99,101,113,118,99,85,90,93,88,80,72,68,62,56,44,35,24,19,12,3,0,0,0,5,12,20,
+26,30,36,50,84,136,153,169,212,215,232,240,248,240,234,241,252,255,255,255,255,253,238,224,214,173,148,157,162,160,201,197,165,154,173,156,170,208,239,247,252,252,255,255,255,255,255,255,
+255,252,250,254,249,236,238,234,234,219,218,218,207,213,217,201,193,186,139,80,57,31,23,43,48,36,42,50,31,21,16,7,5,6,1,0,14,44,36,8,2,7,13,7,6,6,10,13,
+8,8,12,14,22,31,31,33,37,37,35,50,113,151,170,180,149,116,99,129,163,191,203,185,112,70,64,79,121,125,127,160,161,144,98,79,79,101,125,158,214,215,198,210,215,207,193,219,
+194,142,139,164,197,248,255,255,255,255,255,255,255,252,249,255,255,255,253,248,236,190,167,177,226,231,228,183,154,182,219,203,139,114,125,99,93,98,83,79,77,70,70,69,62,66,75,109,
+182,242,253,254,254,250,239,219,207,200,210,207,204,193,114,68,42,17,19,28,24,20,49,64,84,83,90,90,68,49,49,70,101,105,85,79,90,92,101,106,106,111,104,87,82,78,72,64,
+59,61,56,44,35,29,23,15,8,6,5,7,8,13,17,23,31,38,43,58,101,142,154,177,206,213,232,239,240,245,247,252,254,255,255,255,255,252,229,224,207,185,185,187,176,165,205,185,
+157,169,162,146,187,226,248,252,255,255,255,255,255,255,255,255,255,253,249,252,254,247,236,227,235,201,205,207,192,208,221,191,176,175,140,108,90,50,22,55,70,69,68,59,42,21,8,0,
+0,0,0,1,16,22,16,12,7,9,15,15,8,5,9,12,10,8,8,14,20,27,31,28,36,36,31,57,125,171,191,200,158,132,126,147,175,201,167,106,70,61,76,91,134,150,119,118,
+134,132,122,98,105,129,132,165,231,220,203,214,215,225,218,215,190,143,155,171,193,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,171,133,122,163,208,197,192,171,199,220,182,121,
+85,101,116,127,130,100,84,65,45,41,50,41,52,68,73,101,178,247,253,255,254,247,228,208,203,203,205,205,197,197,128,52,57,33,22,23,21,20,38,66,98,95,78,61,42,40,44,69,
+106,120,111,108,111,114,119,119,104,88,83,75,73,66,61,58,55,55,44,34,29,23,20,15,9,8,10,10,13,19,26,34,42,47,51,64,102,109,135,183,210,211,225,234,241,246,252,255,
+255,255,255,255,254,245,229,205,194,207,215,194,172,173,192,155,147,169,143,160,205,231,250,252,255,255,255,255,255,255,255,255,254,250,252,254,254,255,250,252,249,214,208,217,206,213,224,172,
+142,149,136,125,164,127,66,68,83,76,69,83,77,31,8,0,0,0,0,10,23,17,7,5,7,12,22,24,8,0,2,7,6,5,5,9,15,17,20,21,31,38,29,56,92,135,198,207,
+192,194,162,183,205,170,143,87,44,62,92,111,141,144,120,106,123,123,130,108,113,148,190,204,205,175,178,210,222,222,229,222,197,176,177,194,221,247,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,184,160,149,115,137,139,134,162,208,215,133,90,100,104,129,153,132,72,34,20,21,29,33,36,61,66,47,68,146,233,253,255,254,243,220,205,212,206,201,208,200,200,167,97,
+93,75,44,29,23,20,30,73,109,90,64,49,41,43,64,104,118,115,139,168,160,148,143,143,112,86,72,64,63,59,56,55,48,43,34,27,22,17,13,9,6,6,12,13,20,24,31,42,
+49,54,55,63,85,102,150,196,208,220,232,243,253,255,255,255,255,255,255,255,248,231,224,199,205,208,187,168,153,156,140,114,139,178,162,207,233,236,247,250,254,255,255,255,255,255,255,255,
+252,252,252,252,254,254,255,254,253,234,218,210,207,218,219,176,161,155,169,177,185,187,179,178,189,118,111,140,128,61,14,0,0,0,0,21,29,13,0,0,1,22,31,22,7,0,0,0,
+1,3,0,3,9,17,17,20,30,41,31,40,102,183,205,193,199,153,148,197,186,164,157,115,62,75,97,121,120,120,97,93,108,97,84,88,98,153,175,171,182,196,171,206,224,206,210,218,
+200,191,182,201,224,241,249,253,255,255,255,255,255,255,255,255,249,232,208,220,206,192,163,106,105,105,119,167,208,218,149,105,111,134,132,115,88,34,6,6,14,27,29,49,77,79,57,72,
+168,238,248,252,249,236,213,199,200,200,201,208,205,200,194,189,151,115,113,68,38,28,41,95,119,85,63,52,50,68,108,139,142,132,140,162,180,157,140,133,111,87,66,55,51,52,52,48,
+42,34,27,23,19,14,8,3,1,6,12,19,23,31,38,45,48,56,62,64,73,118,177,199,208,220,235,253,255,255,255,254,255,255,255,247,229,224,211,198,177,161,162,187,161,133,143,142,
+177,214,198,210,190,204,220,239,250,247,253,248,245,247,248,242,243,247,253,252,254,253,250,226,204,210,201,186,184,213,227,203,172,183,205,193,177,183,204,208,210,155,99,118,114,40,2,0,
+0,0,0,9,22,14,2,0,2,40,42,23,3,0,0,0,9,19,9,12,26,41,47,47,68,55,36,71,144,212,226,211,196,150,149,158,133,140,142,123,90,79,87,119,109,141,113,62,
+70,66,59,63,79,115,149,162,150,183,205,206,190,183,192,194,176,183,186,205,221,231,234,252,255,255,255,255,255,255,254,249,207,128,115,149,189,200,160,137,133,118,129,189,218,206,182,141,
+116,118,112,65,42,16,2,3,14,24,27,38,64,84,84,104,178,218,240,245,241,231,199,193,196,196,201,208,206,210,206,212,192,169,179,121,76,52,70,94,97,90,82,68,73,119,172,162,
+144,154,165,176,178,143,125,122,107,82,61,51,48,47,47,41,35,30,23,17,13,9,1,1,2,5,12,22,34,43,49,51,51,56,64,70,75,113,169,173,176,208,236,254,255,255,255,253,
+239,238,240,225,200,194,175,163,158,155,147,172,175,142,158,153,167,192,186,172,139,168,201,218,219,204,218,221,208,198,232,243,243,245,255,255,254,250,236,204,172,178,196,198,192,210,218,197,
+143,179,214,201,182,172,168,170,192,149,94,111,97,30,0,0,0,10,13,8,14,13,7,0,3,27,49,42,6,0,0,0,24,17,12,68,107,93,93,69,71,85,108,137,171,200,214,205,
+148,182,161,120,90,85,88,84,73,73,80,102,102,154,132,77,62,61,63,56,71,98,139,176,158,148,193,205,165,155,160,149,130,155,176,204,197,207,238,254,255,255,255,255,255,255,254,232,
+172,87,72,108,153,143,116,136,144,127,132,204,167,142,146,149,102,64,70,36,13,0,0,0,5,9,20,33,55,59,59,80,133,201,240,243,241,226,197,187,186,189,200,208,214,214,220,215,
+211,221,180,134,116,97,92,82,98,121,100,100,118,144,168,168,139,119,143,143,135,128,123,105,87,75,59,51,44,41,43,38,30,24,19,14,9,5,1,1,2,6,19,36,59,66,65,59,
+58,58,63,65,80,91,122,156,161,186,225,250,255,255,255,241,201,183,199,201,184,168,157,149,135,113,119,125,154,140,125,139,126,150,154,189,191,182,179,172,164,151,167,193,184,194,233,253,
+255,255,254,250,246,246,227,212,213,191,183,193,201,196,173,135,106,161,200,203,208,191,151,139,165,129,93,106,79,21,0,0,0,20,16,12,13,8,3,6,9,26,49,45,13,0,0,0,
+41,27,37,85,129,121,90,56,55,87,133,147,132,150,193,154,109,134,130,115,71,33,24,23,22,31,51,76,82,126,119,88,76,66,65,65,68,92,130,162,169,164,184,203,175,143,153,126,
+101,120,146,192,207,203,234,254,255,255,255,255,255,255,255,224,123,68,58,73,85,85,101,134,149,148,122,140,121,105,88,83,51,28,33,23,3,0,0,0,0,2,10,22,43,35,30,43,
+70,172,229,222,215,191,165,161,172,171,193,207,228,228,231,225,227,226,170,163,177,168,114,77,94,106,93,99,115,125,133,129,119,108,108,100,92,98,97,78,65,59,55,49,41,38,38,35,
+26,19,13,9,3,1,0,0,1,8,28,51,84,85,73,69,68,68,68,70,79,82,100,134,183,189,204,238,252,253,243,229,208,203,205,210,184,161,150,127,118,100,97,112,114,108,127,140,
+130,155,182,211,214,167,173,164,141,134,151,178,201,198,232,254,245,218,207,203,215,226,219,220,217,184,171,172,191,178,119,86,120,136,186,205,207,180,140,128,126,113,98,105,52,15,1,0,
+24,43,26,21,21,17,13,12,22,37,52,55,26,0,1,20,42,44,42,33,63,99,100,61,47,59,72,91,92,113,171,130,130,109,97,128,95,17,13,16,15,17,24,42,57,95,94,72,
+68,59,58,71,72,76,92,107,132,157,168,177,162,130,140,126,129,125,147,200,217,225,231,254,255,255,255,255,255,255,255,235,126,47,57,83,95,86,94,128,147,162,133,105,102,78,54,22,
+7,8,20,17,9,6,1,0,0,0,0,7,17,20,23,27,65,179,228,192,170,157,139,114,134,167,194,200,228,240,239,239,236,236,231,229,218,212,156,101,92,86,76,75,87,101,99,102,
+102,94,82,71,68,68,62,51,51,45,38,41,37,36,34,28,22,16,10,3,1,0,0,0,3,13,31,58,80,77,73,76,77,84,84,100,106,128,160,182,211,205,161,178,227,234,234,225,
+222,220,203,161,142,126,111,104,109,102,104,114,104,114,133,119,122,187,245,242,225,215,233,225,203,160,165,191,218,231,247,255,225,192,199,220,228,227,218,217,205,200,196,178,185,157,111,91,
+115,154,197,210,187,118,72,104,125,104,94,95,65,27,17,23,59,59,33,24,37,33,23,24,40,61,82,93,37,21,40,41,23,10,5,5,10,49,68,44,38,42,50,62,50,77,106,126,
+155,134,127,147,105,22,20,37,36,29,28,30,42,71,83,73,58,43,37,43,49,56,65,71,84,114,130,178,175,132,126,116,119,147,157,210,219,218,236,252,255,255,255,255,255,254,252,245,
+171,66,65,118,123,108,120,127,130,129,102,82,122,100,47,14,6,12,14,21,20,2,0,0,0,1,5,10,13,20,23,28,106,193,182,136,134,148,135,118,139,178,198,198,236,247,249,250,
+252,252,252,248,243,232,163,115,95,71,65,62,63,70,79,88,80,65,61,57,51,48,42,40,40,30,27,27,28,26,24,20,16,14,9,3,1,0,0,1,8,16,31,45,55,61,66,72,
+77,87,99,129,140,172,201,207,203,153,79,108,135,157,211,224,224,191,142,92,76,72,70,75,86,91,105,108,114,128,121,97,119,210,255,255,231,178,179,197,176,147,130,128,169,240,249,242,
+220,224,227,235,221,219,215,212,204,208,185,156,140,149,141,112,144,191,206,204,177,122,76,97,115,100,86,63,76,62,37,30,71,59,44,34,40,31,30,55,76,75,80,82,66,82,68,40,
+10,0,0,0,0,0,15,24,51,49,34,63,57,36,59,158,129,104,120,129,119,43,34,56,52,45,37,31,40,55,72,63,44,34,26,17,28,37,41,45,49,76,112,186,208,163,143,134,
+119,142,154,184,193,204,245,253,253,254,255,254,254,252,249,240,146,78,97,156,165,115,126,128,122,129,73,50,87,63,28,20,13,12,15,29,21,3,0,0,0,7,14,17,20,19,26,52,
+143,186,143,126,143,154,154,142,161,187,204,226,247,252,253,255,255,255,255,254,249,187,102,95,78,68,59,58,65,75,76,78,71,59,51,51,50,41,34,33,24,15,14,14,16,14,14,12,
+12,8,5,3,2,1,6,12,19,21,30,37,44,54,62,69,77,85,95,144,172,182,194,194,148,65,48,61,66,88,182,215,186,118,83,73,65,59,61,69,83,95,100,101,113,116,101,86,
+105,182,246,239,187,141,111,129,123,108,99,109,154,217,204,183,172,198,217,225,212,200,176,151,155,158,141,144,146,175,189,178,157,165,179,173,177,163,127,123,105,93,105,107,154,141,108,106,
+98,51,35,34,48,40,51,91,108,95,87,93,83,71,41,16,0,0,0,0,0,0,3,24,43,34,22,44,50,58,119,183,93,114,113,113,121,69,42,80,77,48,35,27,31,37,55,52,
+35,21,17,13,15,20,24,30,40,65,77,147,194,161,133,142,154,150,151,172,185,194,210,242,250,253,253,254,249,241,239,236,190,107,107,132,189,149,119,129,141,115,41,42,55,40,24,20,
+14,12,20,31,14,1,1,0,1,9,17,23,26,22,36,70,169,186,135,130,119,105,137,153,190,200,212,247,253,253,255,255,255,255,255,255,250,176,88,68,63,70,71,68,87,101,85,80,
+71,77,58,48,44,34,28,22,14,7,5,3,6,6,7,5,3,2,2,1,5,7,12,26,30,26,30,36,45,56,66,78,95,107,118,162,168,167,190,186,107,57,49,51,63,97,170,197,
+178,136,101,104,102,86,83,83,94,109,101,97,102,97,88,91,130,176,218,176,163,132,105,132,142,106,112,149,183,184,178,158,137,150,197,198,197,169,118,98,105,127,127,162,179,197,212,186,
+141,147,164,173,170,155,115,120,116,123,144,165,184,177,175,187,176,106,42,42,57,77,85,102,162,155,128,127,84,26,3,0,0,0,0,0,0,0,0,31,33,34,22,10,23,61,140,140,
+87,97,109,118,126,98,73,98,91,64,43,28,29,38,45,43,29,21,15,10,12,13,17,22,36,49,45,108,205,207,154,133,142,144,148,153,170,189,189,231,242,246,247,243,239,233,231,225,
+227,164,112,111,168,168,149,136,157,115,29,23,35,31,20,15,15,13,15,13,6,1,3,3,8,17,27,34,37,50,79,91,137,133,91,100,91,106,128,142,206,219,222,236,253,255,255,255,
+255,255,255,255,252,187,92,57,68,83,83,72,88,111,92,78,71,82,57,41,33,26,21,13,7,0,0,0,0,0,2,0,0,0,0,0,6,12,20,30,38,34,34,38,47,58,77,92,
+105,109,113,115,122,151,191,173,104,70,56,48,62,68,77,146,190,161,129,133,127,101,90,82,80,90,90,86,104,146,204,217,246,252,224,155,119,94,93,107,112,99,97,134,154,153,170,169,
+157,158,163,180,179,139,92,73,91,114,113,165,199,191,189,190,180,192,197,187,161,147,150,148,160,180,182,186,178,170,183,190,183,147,112,101,119,179,164,179,229,211,175,136,107,33,2,0,
+0,0,0,0,0,0,8,30,26,34,21,7,8,37,88,95,58,76,113,135,151,128,111,106,99,84,62,42,40,47,44,33,29,26,17,10,9,9,20,29,29,38,44,77,178,231,201,185,
+171,178,165,156,164,189,196,225,235,232,231,226,221,196,201,197,194,146,129,154,155,146,127,123,155,112,36,21,23,21,17,15,14,17,16,12,3,3,6,8,14,26,37,50,64,86,100,113,
+135,122,88,111,86,93,82,116,184,212,224,234,254,255,255,255,255,255,255,255,238,128,63,70,86,94,65,55,76,88,80,70,64,58,47,37,28,23,14,7,5,0,0,0,0,0,0,0,
+0,0,0,1,8,17,28,38,54,49,36,38,50,70,85,86,79,70,59,52,68,107,141,108,66,58,56,54,58,58,68,116,150,140,120,126,104,90,87,79,76,83,90,88,109,155,235,253,
+234,246,224,191,107,73,70,70,65,71,91,108,123,142,148,141,142,139,132,146,136,88,75,82,99,88,113,173,189,185,182,219,210,196,194,178,142,160,182,176,198,196,198,192,148,134,176,221,
+218,213,203,212,233,247,243,240,235,212,179,150,136,66,16,0,0,0,0,0,2,15,51,70,43,41,31,16,10,21,44,56,69,87,122,137,136,139,182,161,155,144,127,87,59,65,51,29,
+23,17,13,12,14,24,34,50,43,49,77,108,190,235,231,229,219,206,192,186,176,191,203,221,220,222,207,206,213,143,130,149,149,120,127,191,164,143,176,169,135,93,61,45,44,38,33,30,
+24,27,26,20,12,10,12,13,21,33,44,70,99,101,79,100,144,119,88,99,71,75,82,99,175,190,194,238,255,255,255,255,255,255,255,255,222,121,69,90,113,94,70,66,76,73,80,66,
+55,49,43,34,30,22,14,8,3,0,0,0,0,0,0,0,0,0,0,3,8,21,37,49,65,72,51,48,64,77,78,71,56,41,42,41,42,58,75,71,68,70,72,66,54,63,88,95,
+91,90,76,82,95,97,72,71,88,130,171,125,90,106,119,150,179,182,156,150,87,61,62,58,62,93,132,113,106,112,118,121,125,129,134,129,112,83,82,107,102,92,133,186,206,224,239,229,
+200,199,186,136,139,191,218,207,205,182,184,182,147,146,219,249,241,247,252,255,255,254,252,245,236,220,168,160,154,100,34,16,17,26,22,20,21,43,58,78,85,68,72,62,35,22,42,69,
+144,107,123,146,148,169,226,207,201,201,179,129,106,116,71,41,24,14,22,30,26,33,37,55,78,100,121,162,207,243,249,249,246,225,204,194,193,199,205,206,205,210,201,184,198,176,125,102,
+91,129,168,208,192,183,190,167,130,106,106,112,106,84,57,41,38,42,38,27,20,15,17,20,34,48,56,82,101,85,77,136,136,102,93,90,80,84,90,113,178,189,210,240,255,255,255,255,
+255,255,255,254,217,135,83,98,108,83,88,79,76,79,79,66,51,50,45,36,30,21,14,8,2,0,0,0,0,1,0,0,0,0,3,12,22,37,51,65,82,87,77,69,72,63,56,58,
+48,31,28,29,37,51,63,72,80,79,78,86,100,95,91,86,73,65,63,82,108,113,84,79,139,168,160,118,95,109,111,127,177,136,107,105,78,51,57,55,71,134,163,126,122,127,150,144,
+122,120,105,92,80,69,80,91,80,114,156,206,229,238,242,214,193,220,169,153,180,151,190,214,196,217,206,208,217,233,255,254,253,255,255,255,255,255,255,247,239,218,170,194,193,132,52,23,
+31,43,48,40,33,30,41,69,93,115,144,115,42,34,73,148,183,150,144,161,163,171,206,233,229,196,154,139,147,137,99,82,38,33,54,42,42,36,43,78,127,137,141,191,231,246,250,252,
+246,228,213,204,196,198,204,201,201,198,204,170,132,157,104,65,68,149,213,226,213,200,141,141,169,141,147,148,122,82,52,43,47,55,49,35,26,20,23,30,42,54,63,77,88,85,97,134,
+168,144,107,120,123,87,87,106,171,213,233,243,255,255,255,255,255,255,255,250,221,161,137,102,99,90,79,56,56,62,61,61,56,55,48,41,33,20,14,8,1,0,0,0,3,3,1,0,
+0,6,13,27,59,77,87,88,101,113,79,82,109,78,44,42,35,24,20,22,29,37,55,70,86,82,73,93,123,99,84,88,65,47,57,85,119,153,162,184,234,176,154,125,137,155,180,175,
+142,114,126,121,83,57,64,79,123,175,176,168,187,171,175,150,115,95,77,62,52,58,75,71,79,120,149,178,191,187,194,211,220,242,191,173,148,128,178,212,221,249,250,255,255,254,255,255,
+255,255,255,255,255,255,255,253,245,229,222,218,175,126,78,36,31,35,41,38,42,30,45,71,115,189,224,173,79,97,126,163,176,167,148,162,157,162,198,222,227,165,130,128,139,142,140,128,
+119,112,84,43,48,43,54,91,123,126,133,179,240,250,254,253,247,235,222,217,204,200,206,199,193,183,161,123,91,78,42,27,45,123,214,231,210,199,168,149,194,190,155,156,111,57,47,52,
+59,63,52,40,33,30,30,37,45,56,68,79,93,97,88,101,150,163,121,154,151,86,88,108,172,219,245,254,255,255,255,255,255,255,254,246,224,191,187,129,109,85,50,28,41,58,64,64,
+62,56,49,44,29,19,16,12,5,2,2,6,9,6,1,1,3,10,16,27,52,71,98,107,127,121,68,66,98,85,50,36,30,24,19,19,23,26,41,63,91,86,84,97,105,92,80,77,
+61,48,59,73,133,186,212,247,255,245,236,219,205,190,180,160,102,107,154,135,82,69,79,123,179,219,210,197,191,182,175,139,113,91,70,54,44,48,55,73,70,92,125,140,167,173,177,211,
+200,190,199,160,135,157,206,215,234,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,247,231,224,203,192,158,93,54,38,15,22,37,43,40,51,102,175,247,255,248,227,215,229,189,
+141,172,175,194,180,189,194,224,226,169,118,106,105,129,157,156,190,168,99,79,78,61,65,107,143,171,161,175,240,254,254,253,245,231,219,217,210,203,204,194,194,147,57,58,38,15,10,12,
+26,86,173,212,201,184,180,153,172,200,178,144,84,44,44,56,62,69,63,49,43,36,37,45,54,71,86,88,90,85,76,83,112,118,156,196,148,85,83,123,169,212,250,255,255,255,255,255,
+255,255,254,252,225,197,196,134,75,54,27,27,54,70,64,54,55,54,48,41,27,21,21,15,9,7,5,8,7,6,3,5,6,14,21,24,30,40,83,113,148,79,55,56,68,69,48,36,
+27,23,21,19,17,19,31,99,109,94,112,134,113,83,83,91,65,59,79,95,163,201,247,255,255,255,255,224,197,189,141,90,80,104,105,94,83,84,113,149,192,241,232,211,179,192,179,153,
+127,101,78,59,41,43,49,63,61,65,97,133,143,160,179,183,160,112,177,170,146,149,189,189,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,247,238,222,214,211,186,95,49,
+65,63,56,51,55,65,71,129,193,247,255,255,255,255,255,160,168,187,215,233,225,227,218,217,228,211,160,101,105,119,128,161,179,191,157,143,122,113,163,189,204,221,207,215,253,253,255,252,
+242,231,217,208,204,206,204,196,192,107,29,30,10,3,5,2,38,87,135,200,213,161,127,116,139,167,204,182,129,84,59,56,71,79,68,50,50,44,42,50,57,73,93,85,82,90,72,72,
+122,118,169,167,149,137,101,108,142,187,250,255,255,255,255,255,255,255,255,240,193,189,186,126,71,50,20,29,41,47,59,52,48,52,51,34,24,26,30,28,19,7,3,5,6,8,10,12,
+10,17,26,33,31,30,61,109,139,64,45,55,68,51,31,33,31,23,22,21,19,24,49,132,158,171,182,185,144,100,93,79,54,58,92,126,165,153,212,248,255,255,255,239,186,154,114,80,
+82,90,98,92,98,113,171,182,201,246,232,211,207,212,192,158,134,142,149,84,43,50,44,47,61,50,71,93,88,128,157,123,104,97,140,157,123,101,142,160,203,255,255,255,255,255,255,255,
+255,255,255,255,255,255,253,249,247,236,229,218,205,200,173,132,127,136,98,70,77,93,133,169,214,247,255,255,255,255,253,178,212,215,222,240,242,248,219,179,185,225,217,158,123,135,127,193,
+219,208,217,210,204,224,222,193,179,196,221,227,250,254,252,249,241,231,220,214,204,210,206,198,184,102,47,13,0,2,2,0,28,111,168,186,201,169,137,112,135,169,191,205,192,119,76,72,
+80,100,80,52,44,43,43,55,63,64,73,71,79,92,82,83,99,129,142,142,185,163,114,99,130,199,248,254,255,255,255,255,255,255,252,206,168,179,191,156,85,62,31,41,52,65,97,71,
+54,49,38,28,29,35,37,30,16,9,7,6,7,10,13,14,19,23,30,30,26,33,48,116,126,71,45,48,56,47,28,30,33,29,24,24,24,37,70,114,153,197,208,185,155,134,108,77,
+56,54,68,91,113,123,179,240,255,255,255,252,194,151,128,114,92,76,76,98,132,154,186,205,213,208,182,171,217,229,184,142,183,196,172,95,47,57,49,33,49,38,43,49,54,86,94,70,
+56,66,94,108,82,79,106,143,178,227,219,234,255,255,255,255,255,255,255,255,255,254,250,250,245,238,226,210,208,215,222,205,201,164,142,126,114,165,212,232,227,239,255,255,255,252,240,242,
+189,210,232,239,250,249,173,130,146,193,201,210,199,184,180,231,233,233,240,238,239,248,234,214,204,205,213,212,234,253,252,250,241,227,218,213,207,206,204,167,120,91,41,0,0,1,2,0,
+9,79,123,147,161,163,136,113,143,184,203,199,184,162,118,95,108,105,77,54,42,42,44,54,61,61,61,58,63,75,84,87,106,151,143,155,146,111,99,135,156,198,235,242,254,255,255,255,
+255,255,247,198,180,201,205,171,95,88,83,101,112,128,150,112,73,51,33,33,36,42,36,26,17,13,9,8,10,12,16,21,26,29,34,30,29,50,69,101,84,43,42,44,41,40,37,37,
+35,35,33,29,30,43,73,120,140,168,175,141,111,92,91,97,90,91,79,97,132,142,170,236,255,255,255,249,175,170,172,147,116,100,90,115,169,183,185,198,215,184,164,203,234,211,127,130,
+247,235,144,86,82,83,62,35,34,47,45,41,45,58,76,72,54,63,78,75,69,73,95,160,184,148,155,199,252,255,255,255,254,252,253,253,253,252,252,247,235,227,226,214,213,225,227,214,
+212,194,204,199,170,215,255,255,248,247,254,255,255,247,205,217,222,218,239,239,241,246,178,107,135,148,151,205,225,213,235,246,236,241,247,246,242,250,250,242,231,224,215,206,225,247,253,249,
+241,225,212,204,205,205,204,173,93,41,28,8,0,2,3,0,8,41,71,91,97,128,143,113,116,150,182,206,224,197,151,106,107,79,66,58,48,48,52,55,55,56,52,50,54,59,76,73,
+98,157,165,150,106,101,133,165,206,208,211,239,247,252,255,255,255,255,241,221,217,210,194,137,80,108,125,126,127,133,154,116,92,55,41,40,40,38,30,26,23,16,14,10,13,20,24,28,
+30,31,36,38,47,85,112,112,79,54,43,41,40,37,40,41,40,38,37,34,36,40,56,83,108,128,125,94,66,50,52,70,106,128,116,148,179,148,139,196,255,255,252,215,193,207,165,135,
+123,116,115,128,149,175,201,210,221,199,206,234,218,148,119,163,232,194,143,102,93,83,68,30,27,40,51,55,61,68,98,94,76,94,119,99,73,78,93,135,154,141,179,210,235,254,255,255,
+252,231,229,231,228,233,245,224,198,199,206,215,229,235,229,225,228,238,248,243,233,246,255,255,255,255,255,255,255,252,199,213,242,229,240,246,239,234,179,133,148,170,160,198,238,236,253,252,
+249,250,248,247,250,254,245,192,185,201,224,227,238,247,253,249,234,218,210,208,190,187,193,126,41,15,16,13,2,5,8,8,26,30,35,69,86,95,140,135,109,125,142,183,217,180,160,136,
+107,72,72,68,57,55,61,59,59,55,47,43,44,45,45,54,108,158,129,113,134,141,158,177,208,206,222,240,236,247,255,255,255,255,239,229,234,224,194,134,87,92,104,104,109,122,134,101,
+90,58,51,40,34,31,28,29,28,21,22,17,20,24,31,34,37,38,41,59,82,116,141,149,119,82,55,41,40,37,40,42,44,43,42,37,40,42,54,75,92,102,97,70,42,30,36,48,
+72,102,137,156,158,177,162,163,201,233,255,189,197,199,150,129,100,87,93,122,130,165,199,211,213,213,234,234,196,135,150,201,217,186,154,165,148,123,76,17,24,42,57,73,100,113,122,106,
+114,143,137,101,70,76,93,128,115,148,190,187,227,246,248,248,239,226,198,180,217,217,206,199,198,196,200,222,246,245,235,233,243,247,248,249,254,255,255,255,255,255,255,255,255,255,239,239,
+247,246,250,253,246,235,213,229,215,218,214,246,250,254,250,253,253,253,253,250,254,254,241,196,205,213,221,234,241,247,246,245,228,214,206,204,179,171,153,82,33,19,21,12,8,12,17,13,
+19,20,20,37,51,100,150,139,105,114,115,121,146,135,141,170,115,71,73,71,66,56,59,63,59,51,45,43,42,44,44,43,64,88,88,85,126,158,186,225,229,222,233,229,212,240,255,255,
+255,255,250,245,247,236,183,116,101,100,114,130,155,165,139,95,80,62,55,41,31,33,29,30,30,28,28,26,27,42,50,45,57,55,66,115,142,151,154,148,130,90,50,42,43,41,43,44,
+47,50,47,41,42,55,70,76,87,90,80,64,41,30,31,42,63,90,147,153,156,198,204,173,161,211,245,172,170,176,132,95,83,79,100,115,123,165,190,221,227,234,235,193,140,111,120,187,
+220,217,215,218,205,143,61,21,29,54,77,88,144,132,137,153,168,164,141,125,92,73,94,126,146,155,170,189,175,175,163,199,210,207,180,182,205,214,194,182,178,170,183,220,241,243,238,242,
+246,247,248,253,255,255,255,255,255,255,255,255,255,255,252,250,248,248,253,254,253,252,255,255,255,252,255,255,255,255,254,254,255,255,254,255,255,252,248,235,227,232,228,234,242,242,241,235,
+222,219,207,199,182,161,143,125,72,24,24,14,12,17,49,30,10,9,3,13,68,112,119,101,69,71,69,76,114,151,151,140,95,71,73,70,66,56,56,58,57,52,48,45,44,45,49,47,
+43,50,61,70,93,158,219,222,221,220,224,220,214,201,214,241,249,242,231,246,246,219,161,123,122,134,134,168,196,212,193,91,77,61,44,34,29,31,33,31,33,36,30,34,41,57,65,64,
+73,84,97,113,153,177,172,157,125,102,58,48,48,47,48,48,49,55,52,44,48,64,61,65,97,92,82,62,40,35,36,36,41,68,102,128,176,233,224,201,205,191,198,176,177,154,91,66,
+72,80,106,120,127,164,200,226,213,222,205,155,102,64,94,189,186,146,201,218,184,114,56,28,45,82,87,92,182,186,199,217,199,143,121,115,80,82,120,140,175,199,180,190,127,94,114,154,
+162,164,172,168,176,199,183,153,135,136,180,211,229,236,241,241,248,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,248,248,254,255,255,252,253,255,255,255,255,255,255,255,255,254,
+255,255,255,255,255,254,255,250,234,231,228,231,242,241,239,232,220,218,208,196,164,105,128,142,50,15,15,13,15,27,52,59,17,15,16,20,63,93,82,90,56,54,58,61,97,132,132,126,
+98,75,80,79,64,52,57,62,65,65,56,50,45,40,40,40,37,40,54,98,121,168,226,198,200,201,206,217,215,197,212,222,239,239,234,241,238,225,171,154,122,130,150,150,179,212,179,70,
+56,36,19,20,27,33,33,33,36,35,38,50,68,79,76,72,92,133,122,102,148,189,184,162,143,128,70,54,54,52,56,58,55,57,55,50,48,50,55,71,94,90,73,45,31,29,28,24,
+23,37,58,97,160,211,220,214,217,203,187,196,178,128,82,65,55,66,80,111,136,184,219,193,178,177,184,175,130,148,143,157,172,135,167,205,203,133,77,50,72,102,91,101,158,224,226,226,
+196,126,108,100,86,114,146,149,198,214,153,144,120,85,95,118,104,102,108,93,109,135,144,135,109,111,163,200,217,226,238,242,247,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,
+247,249,253,254,254,253,252,255,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,252,236,231,236,233,233,235,225,217,211,208,191,108,59,121,128,34,3,7,6,12,38,64,50,
+23,34,31,28,40,55,52,65,54,42,54,52,75,91,107,140,106,71,73,73,58,55,69,84,98,93,66,58,52,42,41,38,41,64,94,142,148,175,215,180,171,161,193,225,240,242,247,246,
+249,243,238,238,217,205,183,165,108,108,158,163,178,208,182,65,19,13,8,13,29,42,44,43,49,47,52,72,116,113,83,82,125,163,160,179,203,198,175,127,106,108,73,65,59,59,65,68,
+59,56,52,50,51,59,69,73,69,70,52,31,31,21,19,13,21,38,54,92,148,176,213,215,208,214,187,183,164,127,114,90,65,84,113,135,155,150,156,144,132,160,205,232,236,240,222,218,
+220,187,162,150,161,146,97,58,68,73,82,126,133,200,207,171,144,148,158,128,150,196,205,215,212,178,150,126,100,116,101,85,90,90,94,84,82,126,134,149,128,132,162,201,211,227,236,243,
+248,253,255,255,255,255,255,255,255,255,255,255,255,253,253,250,245,242,248,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,250,254,254,254,245,240,241,229,222,226,218,
+207,207,201,189,115,41,95,112,51,16,8,9,13,48,62,27,20,28,44,57,41,51,56,76,71,44,50,52,62,73,80,111,111,79,75,85,78,84,84,97,123,105,69,62,59,56,56,52,
+56,91,128,154,161,175,211,162,139,146,186,221,238,234,225,239,245,241,234,235,215,200,212,198,143,134,189,199,180,185,186,125,42,17,14,21,37,61,70,62,68,72,80,101,126,119,95,104,
+129,161,186,205,214,205,140,86,71,78,79,73,62,65,70,68,63,58,54,51,61,68,63,54,41,35,28,22,23,15,9,5,3,20,45,85,135,154,186,201,183,190,213,196,151,130,134,143,
+140,148,155,158,175,151,144,129,123,157,206,231,235,208,212,228,231,215,190,171,160,172,144,75,44,50,78,104,91,122,137,163,185,210,199,143,137,163,168,162,151,155,142,108,120,170,143,92,
+92,95,94,84,99,107,105,150,142,150,186,225,231,240,246,249,253,254,255,255,255,255,255,255,255,255,255,255,254,249,235,238,236,236,248,252,254,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,253,254,255,255,252,247,243,228,205,199,208,201,199,198,185,116,21,37,51,41,29,23,14,13,29,33,37,31,29,28,41,45,64,93,83,50,49,50,55,62,56,63,83,
+109,98,99,102,90,102,102,111,112,86,68,62,62,65,61,59,68,95,143,164,177,154,182,151,143,154,190,228,225,210,210,222,232,242,238,225,224,220,218,211,186,187,208,212,184,175,183,164,
+88,57,51,48,68,94,109,85,93,101,114,141,143,128,119,122,116,119,176,201,215,194,129,86,84,77,78,70,62,63,66,68,64,59,56,54,61,62,51,42,33,23,17,14,10,7,1,0,
+0,0,12,51,105,128,150,161,150,167,196,206,177,154,156,168,176,157,142,148,158,155,154,134,115,158,218,220,197,168,179,206,222,210,196,197,186,168,155,82,33,35,50,47,50,72,91,133,
+153,154,187,189,178,160,147,118,87,125,137,115,154,191,156,154,157,134,95,84,95,94,120,142,128,160,207,238,239,248,253,254,254,254,255,255,255,255,255,255,255,255,255,255,243,217,185,193,
+211,232,240,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,252,255,255,255,250,231,210,203,176,200,197,193,194,180,109,10,10,22,41,38,28,9,5,7,13,21,
+22,19,28,40,54,75,134,108,34,36,42,51,56,47,50,69,107,129,102,91,95,97,107,100,83,75,66,64,62,59,57,61,77,114,180,183,189,162,168,160,170,169,183,200,186,205,221,218,
+225,238,235,219,226,234,222,204,205,208,204,206,201,187,165,108,108,99,87,85,98,120,139,107,106,125,141,179,171,132,113,130,139,126,169,194,208,199,156,123,92,80,80,72,62,61,63,69,
+68,61,57,54,55,58,48,41,33,23,15,10,6,6,0,0,0,0,0,26,72,101,133,132,127,153,180,168,172,182,158,133,155,146,141,139,140,144,140,133,106,130,169,164,165,172,156,178,
+200,215,196,171,183,173,133,62,26,24,34,34,30,52,59,95,134,165,183,186,170,163,148,99,66,84,114,155,162,150,172,200,161,129,100,108,118,106,130,125,132,184,215,242,245,250,254,255,
+254,254,255,255,255,255,255,254,254,246,238,247,240,200,146,156,156,185,200,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,247,247,255,255,250,213,190,208,178,190,
+194,190,185,177,121,12,0,3,26,34,28,12,8,3,6,7,9,13,44,61,50,79,123,116,50,36,42,48,52,49,47,69,108,146,114,91,102,119,116,83,78,83,72,68,64,54,55,66,
+83,104,176,182,192,210,184,168,191,205,189,189,190,190,220,231,239,241,238,241,233,234,210,191,205,193,180,200,214,200,154,106,128,122,133,128,127,157,158,135,136,155,175,201,184,140,127,151,
+137,168,201,201,208,207,192,147,107,86,82,75,66,68,66,69,68,58,56,54,54,52,44,40,33,26,19,13,8,6,5,0,0,0,1,15,52,95,140,142,144,160,208,176,178,200,161,140,
+156,129,140,125,106,112,127,157,163,139,126,162,153,177,178,183,206,210,217,187,171,165,73,35,24,26,27,21,13,27,50,102,148,178,185,186,162,156,112,57,61,90,130,167,148,148,173,161,
+128,114,102,95,98,97,136,142,180,227,228,239,239,248,252,253,253,254,250,252,253,253,252,249,243,235,234,239,229,211,153,130,137,142,167,212,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,248,243,242,238,240,253,255,247,205,171,198,164,172,187,184,184,178,148,52,5,0,2,17,21,20,17,5,6,7,6,9,27,37,24,58,82,83,55,41,45,49,58,61,62,84,
+125,164,149,119,111,128,112,78,78,73,71,66,61,55,56,72,94,118,165,163,165,217,178,193,211,221,189,194,196,186,225,233,245,253,248,245,241,234,179,176,192,133,114,158,176,176,148,136,
+148,137,153,147,163,182,175,132,120,155,200,204,184,161,144,143,129,164,187,198,184,183,179,176,153,95,92,90,83,79,68,65,61,55,56,56,55,49,42,37,34,29,22,15,12,9,7,6,
+3,0,2,15,49,92,125,162,162,173,201,208,210,171,141,156,173,149,119,114,87,94,158,190,182,139,141,185,157,206,221,215,220,219,218,210,190,128,47,34,28,27,19,14,10,33,66,111,
+137,144,151,168,155,140,88,44,58,93,160,156,153,133,121,122,167,150,111,125,129,139,187,186,193,178,169,199,214,235,234,248,249,234,221,236,240,239,245,238,232,233,224,201,200,199,164,121,
+170,153,160,184,235,255,255,255,255,255,254,255,255,255,255,255,255,255,253,240,228,227,242,250,247,240,233,190,156,176,162,151,178,186,182,170,133,85,40,17,3,13,20,20,10,1,3,5,
+5,8,12,14,19,36,52,56,56,41,47,64,79,79,85,109,155,192,182,126,94,92,97,87,73,68,65,58,54,54,57,73,90,114,135,130,164,197,177,226,235,233,197,218,235,211,220,240,
+253,254,250,249,236,199,158,164,149,94,92,111,141,168,164,135,134,146,182,192,194,178,162,120,107,133,187,205,189,182,193,192,178,151,148,161,160,163,179,198,177,127,111,112,98,70,59,61,
+55,54,56,54,49,45,40,37,33,28,22,19,15,13,9,9,7,3,3,16,52,94,111,183,204,211,198,214,214,168,148,149,173,193,156,116,82,91,160,169,192,163,179,236,205,198,221,246,
+250,242,239,203,118,68,38,36,41,38,37,29,33,68,70,93,128,151,156,168,168,106,64,54,61,75,114,101,109,104,126,114,151,169,137,149,140,143,171,142,104,64,70,132,177,169,158,201,
+219,208,177,198,207,217,211,218,228,234,225,204,197,198,186,169,170,168,147,172,198,227,247,255,255,242,231,255,255,255,255,255,255,255,252,232,213,226,238,241,225,200,196,165,140,141,132,141,
+178,184,178,160,101,80,61,40,15,12,15,16,10,1,1,5,5,7,9,10,19,40,41,33,41,47,71,87,88,85,105,132,178,207,170,94,78,75,87,87,72,72,59,48,47,49,51,58,
+59,76,94,98,142,175,189,232,241,250,255,253,235,199,219,248,255,255,255,255,242,213,200,199,168,149,126,140,191,189,160,142,150,171,207,203,191,185,168,130,112,114,164,212,213,205,212,219,
+162,114,141,184,167,160,175,172,172,151,137,106,72,51,50,51,50,51,50,48,43,40,38,36,33,29,26,22,19,15,14,12,10,8,8,20,58,88,118,170,193,199,206,226,218,197,177,127,
+90,139,155,109,71,65,91,133,231,255,253,238,193,186,233,249,255,255,253,213,140,85,80,115,134,112,65,49,62,73,49,86,155,154,116,134,165,144,97,87,85,75,68,79,90,87,73,86,
+102,135,137,105,119,97,75,52,27,26,49,85,107,91,101,143,163,162,153,170,172,192,187,182,204,221,221,219,212,225,210,180,154,161,146,160,176,208,225,229,217,179,211,255,255,255,255,255,
+253,231,207,191,192,198,194,201,203,170,172,182,158,141,130,142,183,185,176,162,123,116,90,58,48,21,14,22,21,6,1,5,6,6,7,9,12,30,33,28,30,44,77,99,98,92,100,127,
+162,187,164,88,86,83,84,82,70,65,51,44,41,43,40,35,34,36,43,63,100,149,213,229,227,241,255,255,250,248,254,255,255,255,255,255,247,235,238,238,232,212,194,205,227,210,190,201,
+201,190,212,210,187,163,153,134,116,122,156,210,206,204,219,213,148,155,193,186,121,156,164,155,164,164,128,78,47,40,41,43,45,47,43,41,38,35,33,33,31,29,29,24,23,21,19,19,
+15,14,15,22,45,66,107,151,175,141,184,208,194,143,118,99,64,83,86,65,50,45,50,99,212,255,255,250,245,252,255,255,255,255,253,246,199,168,178,218,206,187,153,142,107,62,102,163,
+169,134,116,163,147,125,114,116,98,71,49,70,77,77,66,71,86,95,77,80,105,84,40,28,23,27,38,73,101,101,113,134,136,142,158,162,165,178,179,171,184,201,218,219,221,224,196,169,
+171,148,132,135,156,168,167,149,122,125,167,241,255,255,255,255,248,226,200,168,168,146,140,175,206,205,193,201,172,156,161,156,173,180,165,154,140,127,108,78,75,70,48,45,40,19,9,7,
+5,6,7,8,12,19,27,33,31,43,71,91,88,80,86,102,137,144,161,119,91,88,84,73,71,59,45,35,30,29,27,28,27,24,28,57,77,130,207,226,214,248,255,255,255,255,255,255,
+255,255,255,255,253,250,254,236,234,206,208,231,228,215,203,205,193,190,196,205,190,130,123,155,157,170,165,197,214,208,229,217,175,194,193,154,121,161,169,153,156,148,99,71,48,40,36,36,
+37,40,38,35,34,30,30,29,29,33,31,30,28,30,28,24,22,20,26,31,44,59,79,115,130,101,112,137,141,95,72,62,56,59,51,40,38,57,56,82,226,255,255,255,255,255,255,255,
+255,255,255,254,240,253,217,213,186,155,199,204,178,155,178,190,157,123,129,172,149,113,126,127,84,49,36,45,59,76,75,73,90,79,82,100,90,52,27,22,28,37,56,90,130,153,163,182,
+190,178,165,154,171,193,183,192,219,220,221,221,220,214,204,198,155,107,84,79,83,85,90,78,92,133,142,179,214,253,255,254,248,245,205,165,157,142,153,179,211,236,225,210,190,178,186,168,
+154,161,148,142,129,115,106,90,76,78,82,72,61,49,27,15,8,8,12,13,13,20,34,44,40,48,66,58,54,68,61,71,108,106,115,86,62,72,72,79,79,59,45,31,23,19,19,22,
+20,16,15,29,49,94,153,197,233,253,255,255,255,255,255,255,255,255,255,255,255,255,255,239,200,194,200,233,207,187,203,198,184,193,180,179,164,140,134,165,171,185,179,204,228,231,236,227,
+231,217,197,156,160,163,170,136,99,80,78,58,48,48,40,34,33,33,35,31,27,27,26,27,30,35,36,33,34,36,34,29,28,27,33,36,50,56,47,57,66,70,54,70,70,66,54,48,
+45,42,37,34,41,82,127,177,248,255,255,255,255,255,255,255,255,255,255,255,255,255,246,179,157,147,213,201,167,173,191,192,171,151,164,182,190,171,133,109,64,28,20,26,38,56,57,71,
+79,77,91,94,62,34,27,26,34,52,78,104,137,175,197,227,225,197,185,178,190,205,219,225,226,208,187,197,210,211,214,194,129,98,69,43,34,36,33,45,90,128,132,121,182,254,255,253,
+248,246,224,203,191,185,180,172,200,228,232,218,192,196,194,192,178,139,126,135,121,101,86,82,95,114,142,139,112,78,49,24,16,14,16,14,15,26,43,50,45,50,54,38,49,55,36,40,
+57,59,41,30,44,59,65,75,80,59,36,28,22,19,19,19,16,12,8,16,31,95,143,171,219,255,255,255,255,252,254,255,255,255,255,255,255,255,252,252,211,184,196,199,189,189,208,208,
+196,186,157,143,163,163,142,144,168,179,193,218,229,227,231,235,240,226,183,190,201,157,158,123,88,63,58,49,47,50,44,34,28,28,27,27,24,23,23,24,29,33,36,35,35,36,37,34,
+31,33,34,37,38,40,40,40,38,38,40,42,51,51,41,42,37,36,41,34,40,83,153,226,255,255,255,255,255,255,255,255,255,255,255,255,255,248,252,213,169,169,173,157,120,99,164,206,
+213,194,196,167,146,128,93,62,31,13,9,13,23,43,59,68,61,58,64,58,42,26,19,26,40,56,78,102,133,173,225,254,242,222,221,217,231,234,234,234,214,187,164,162,182,186,187,167,
+143,114,85,48,27,19,14,31,70,119,129,129,227,255,255,254,248,245,231,214,220,221,191,186,214,217,213,196,199,205,206,201,184,147,119,125,112,87,76,77,121,185,203,197,171,99,61,38,
+23,23,21,17,22,30,41,51,52,49,36,28,40,31,22,23,30,28,23,23,31,41,49,55,65,57,30,26,23,22,20,17,14,9,7,17,36,65,87,136,201,241,246,243,228,243,253,255,
+255,255,255,255,255,255,255,255,220,197,161,121,141,189,213,194,179,171,164,169,168,167,137,140,173,175,177,208,227,226,236,238,239,228,187,205,204,182,139,95,86,62,56,54,40,38,38,30,
+21,19,19,20,21,19,22,27,26,28,34,36,37,40,38,37,31,29,34,36,36,36,38,38,38,37,36,38,43,44,40,38,37,38,45,43,43,64,112,192,247,247,248,248,253,255,255,255,
+255,255,255,255,255,254,255,229,187,154,84,64,56,61,79,94,196,211,206,141,70,51,55,42,23,7,5,8,19,41,70,62,43,38,33,29,29,21,19,33,43,56,85,114,148,192,247,255,
+255,249,253,252,253,255,250,253,242,233,219,189,205,211,190,173,180,151,116,70,37,30,22,30,58,112,126,130,204,242,249,241,234,250,242,217,206,228,220,190,183,183,201,169,198,196,186,192,
+177,136,116,102,88,76,72,83,150,199,227,224,191,144,100,77,47,33,29,24,27,34,41,45,54,38,22,19,14,14,15,16,17,17,20,23,28,31,34,41,50,49,33,27,24,23,22,19,
+12,10,6,10,23,33,51,107,147,186,203,219,221,252,255,255,255,255,255,255,255,255,255,255,199,125,105,88,111,193,227,204,175,171,205,192,158,129,106,151,204,219,220,235,239,238,240,236,
+243,233,207,198,187,173,114,92,80,65,62,50,33,24,29,24,14,12,14,17,16,15,21,26,28,30,34,35,38,42,41,38,35,33,33,35,36,36,37,37,38,36,37,37,38,37,37,37,
+38,41,42,48,54,58,82,126,179,198,220,236,252,255,255,255,255,255,255,255,255,255,255,218,115,95,69,50,51,54,88,97,144,178,183,146,80,83,69,37,19,10,5,7,15,26,45,44,
+28,26,23,20,27,26,28,44,57,76,102,133,171,221,255,255,255,255,255,255,253,255,255,255,255,255,254,247,253,255,232,206,199,171,132,82,51,47,40,42,54,87,137,142,167,210,240,234,
+247,252,212,196,218,236,247,232,221,228,229,177,190,182,170,185,172,126,97,80,68,68,66,94,190,204,240,253,234,201,169,129,83,50,37,33,35,40,40,38,42,30,17,19,12,8,12,13,
+14,15,20,22,23,27,30,37,42,41,33,27,26,23,22,19,15,14,7,5,10,19,36,65,85,119,143,189,243,255,255,255,255,255,255,255,255,255,255,255,185,107,104,100,113,190,249,245,
+218,200,218,218,175,105,99,151,225,252,255,255,252,250,247,243,225,211,213,205,201,208,182,133,109,82,57,34,28,33,36,20,7,8,10,10,13,16,20,28,30,35,35,36,42,45,44,43,
+40,35,35,34,33,35,33,35,35,35,35,36,36,36,37,37,37,35,41,47,55,56,65,82,113,139,177,234,255,255,255,255,255,255,255,255,255,255,255,206,99,78,76,78,71,63,72,94,
+102,127,139,115,104,104,72,34,21,17,10,5,10,16,23,22,17,15,13,19,35,44,48,63,80,104,128,160,189,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239,
+217,186,161,120,84,58,57,76,82,112,157,169,182,207,241,252,255,238,201,201,221,245,250,248,249,255,240,208,203,196,182,178,161,123,92,73,66,66,69,109,196,219,255,255,250,229,199,156,
+90,54,37,36,38,40,36,33,29,26,19,21,21,16,13,13,15,16,17,20,22,23,29,34,43,37,29,31,29,24,22,22,21,16,8,6,6,9,16,33,47,56,83,148,221,255,255,255,
+255,255,255,255,255,255,255,255,232,136,114,127,170,214,250,249,183,190,210,208,205,134,116,178,235,255,255,255,255,255,250,235,233,183,198,218,175,201,200,126,111,82,37,22,26,35,26,8,
+0,1,3,6,8,15,22,29,35,38,38,42,45,44,47,45,40,36,36,34,33,34,31,33,33,33,33,33,34,34,35,37,35,31,33,35,38,38,47,56,63,76,135,204,254,255,255,255,
+255,255,255,255,255,255,255,245,125,70,77,95,84,68,62,83,88,75,84,95,94,73,56,30,22,20,10,6,6,8,9,8,8,6,5,21,47,58,78,99,116,140,163,194,222,253,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,206,173,169,143,98,45,68,80,80,105,133,144,169,187,245,255,239,190,190,218,236,239,248,246,245,228,227,217,204,186,165,167,
+148,120,101,84,73,64,62,87,106,136,238,255,255,245,207,150,69,40,31,33,33,34,31,29,26,24,22,20,20,17,13,14,16,16,16,20,26,26,31,35,54,63,49,35,34,28,26,20,
+20,16,12,8,6,8,10,20,26,40,58,98,158,200,250,255,255,255,255,255,255,255,255,250,219,198,176,175,212,246,252,246,192,191,191,176,163,128,144,218,239,242,255,255,255,255,254,224,
+198,156,201,231,173,192,163,90,87,50,19,15,20,21,7,1,0,0,0,1,6,15,23,30,35,38,40,44,45,45,45,45,40,38,35,36,31,31,30,30,29,31,31,31,31,29,27,29,
+28,27,21,21,30,33,40,45,50,68,97,154,197,242,255,255,255,255,255,255,255,255,252,182,175,156,123,104,77,72,66,79,97,108,104,88,78,58,41,23,16,15,12,7,3,2,1,0,
+1,2,7,21,41,57,108,147,169,192,212,235,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,179,119,116,115,107,72,70,58,52,73,119,112,126,153,200,197,
+180,171,169,198,247,241,241,234,219,171,146,157,168,155,150,167,150,120,95,87,76,65,59,59,59,82,135,172,242,243,161,97,50,36,30,30,31,31,33,28,26,23,22,17,15,13,13,14,
+15,19,23,26,29,36,48,50,64,78,57,35,37,34,24,24,23,22,16,12,10,14,14,24,31,38,48,77,111,151,218,249,255,255,255,255,255,255,255,253,241,206,206,234,234,248,250,253,
+224,184,177,170,150,125,178,241,229,221,253,255,255,255,255,245,201,175,220,236,192,204,140,55,37,22,19,17,17,14,7,1,0,0,0,2,7,15,21,28,35,40,41,43,44,44,43,41,
+36,37,34,34,30,29,29,28,27,28,28,30,30,27,23,23,23,22,20,19,27,37,45,55,52,66,95,130,156,208,247,255,255,255,255,255,255,255,254,218,173,169,158,109,73,78,65,54,
+75,118,102,72,75,56,22,15,15,12,8,6,1,0,2,1,2,5,12,21,31,47,91,162,224,238,254,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,
+217,142,114,118,118,118,68,49,66,77,100,100,114,140,153,164,215,245,240,247,255,252,235,212,153,112,83,92,120,133,148,160,149,112,91,91,79,68,59,57,57,61,84,108,176,186,106,64,
+44,31,28,30,28,29,29,28,27,26,22,14,10,8,10,13,17,16,24,34,36,41,55,64,71,71,48,35,40,44,35,31,26,22,16,12,9,12,14,23,28,29,40,68,102,156,215,236,
+250,255,255,255,255,255,255,255,255,238,205,234,241,248,250,253,249,231,208,184,130,154,211,240,233,245,254,255,255,255,255,255,246,252,249,247,239,205,99,48,31,26,26,22,21,13,8,3,
+0,0,0,2,8,15,20,28,35,41,42,42,43,44,41,37,36,37,34,31,29,29,29,29,27,26,27,27,26,26,23,17,16,19,16,14,23,36,54,55,43,61,86,125,160,210,236,249,
+255,255,255,255,255,254,255,255,233,190,120,76,59,78,62,50,72,93,82,66,59,47,22,26,24,22,14,8,2,2,8,8,6,10,20,28,35,49,78,144,169,198,255,252,218,220,255,255,
+255,255,255,255,255,255,255,255,255,254,255,255,255,231,214,245,231,180,125,106,85,95,59,47,51,57,78,86,97,129,144,164,220,255,249,229,220,196,176,155,101,86,76,66,92,122,144,137,
+107,88,86,88,82,69,61,55,55,58,68,86,109,93,84,63,42,30,26,24,22,23,21,24,26,23,15,9,7,6,6,10,19,19,27,49,55,48,52,71,71,57,43,36,42,50,54,43,
+23,16,12,7,5,6,9,17,21,16,33,63,83,137,228,215,235,255,255,255,255,255,255,255,255,242,189,245,249,240,241,245,235,247,232,179,151,177,210,225,238,254,255,255,255,255,255,254,
+253,254,252,249,254,168,73,58,40,36,30,24,22,17,9,3,0,0,0,3,12,16,22,31,37,42,43,42,43,44,42,40,36,35,34,33,30,29,28,28,27,23,22,23,22,20,17,14,
+14,13,9,13,19,36,59,54,31,49,79,104,141,217,226,228,255,255,255,255,254,252,255,255,255,155,87,44,68,97,63,69,107,99,64,61,73,50,34,41,28,27,21,14,9,17,16,13,
+15,22,28,41,49,59,98,132,116,133,173,194,183,220,255,255,255,255,255,255,255,255,255,255,255,254,254,226,206,170,130,189,133,136,119,108,82,62,54,42,28,30,50,75,97,128,158,165,
+210,243,192,163,153,114,114,91,70,71,52,64,82,99,144,126,84,80,80,84,82,70,61,54,51,54,59,70,75,70,65,51,37,28,19,16,17,17,16,19,24,20,13,7,3,3,1,7,
+21,41,52,72,97,93,64,71,59,48,42,36,43,64,77,56,30,21,15,12,9,6,7,12,13,13,27,62,63,104,191,217,229,255,255,255,255,255,255,255,255,218,198,253,250,239,225,213,
+211,226,233,178,168,190,203,231,243,255,255,255,255,255,255,255,255,253,252,252,236,168,111,73,47,43,33,24,22,17,9,1,1,0,2,7,16,21,28,33,40,43,43,42,43,42,41,40,
+37,37,33,29,28,26,24,26,24,21,20,20,16,12,9,8,9,7,7,6,13,36,52,47,33,49,83,92,115,179,218,221,253,255,254,255,255,255,255,255,232,109,55,47,83,123,134,148,
+165,133,90,73,66,35,33,43,33,28,29,24,35,42,31,24,26,36,47,54,57,59,88,120,113,108,115,182,205,234,255,255,255,255,255,255,255,255,255,255,255,255,253,213,183,178,140,115,
+139,130,139,115,83,48,37,26,20,30,47,65,80,87,128,173,185,184,153,137,132,135,139,123,101,85,58,70,71,97,134,120,95,86,94,97,88,73,61,54,52,52,58,66,64,56,44,35,
+29,22,16,15,17,17,16,19,20,17,13,7,3,3,5,13,23,43,64,68,95,112,77,59,45,41,38,38,54,82,84,62,49,52,41,33,23,14,8,8,12,15,24,48,52,84,151,208,
+231,248,249,252,255,255,255,255,255,235,212,253,208,189,211,184,212,228,231,194,169,186,233,250,252,255,255,255,255,255,255,255,255,253,254,254,246,182,106,82,63,58,38,29,27,20,13,6,
+2,5,7,9,20,27,33,37,40,43,41,38,41,43,42,36,34,33,29,26,24,21,22,22,22,20,15,13,8,5,5,3,3,3,1,1,9,26,40,42,41,54,78,91,112,157,203,220,
+236,238,236,255,255,255,255,255,254,155,42,54,68,95,140,169,169,147,127,107,68,45,31,38,34,31,36,45,73,66,47,37,37,50,80,78,62,62,88,116,122,108,126,169,198,205,241,252,
+255,255,255,255,255,255,255,255,253,253,255,236,192,169,156,157,177,172,169,141,97,57,40,16,14,26,45,55,34,30,70,114,118,109,100,114,129,142,140,151,127,77,61,70,75,114,134,164,
+144,122,114,102,85,72,64,57,52,55,57,56,55,48,37,28,22,19,17,17,16,17,17,15,15,16,14,10,8,7,8,17,30,40,52,65,73,86,75,50,42,42,44,55,73,88,95,108,
+125,115,82,56,42,31,22,14,15,21,24,40,65,109,140,183,219,238,254,255,255,255,255,255,255,246,245,255,203,164,189,205,243,247,238,232,224,204,241,255,255,255,255,255,255,255,255,255,
+254,255,255,255,250,183,129,116,101,55,35,38,35,22,17,14,8,7,10,14,23,31,40,42,44,44,41,38,37,38,38,34,31,26,22,20,16,17,21,21,19,13,10,6,0,0,0,0,
+0,0,0,0,7,19,27,37,47,59,79,106,143,165,193,219,221,234,239,253,255,255,255,255,254,186,93,69,68,76,100,132,126,101,83,82,87,84,79,70,69,92,84,85,87,61,54,51,
+50,69,97,95,97,99,119,143,144,125,161,194,200,194,215,248,255,255,255,255,255,255,255,255,246,247,242,217,207,211,208,198,180,191,175,155,118,79,52,28,20,22,33,20,16,26,47,55,
+42,38,44,84,115,118,128,120,88,54,56,70,95,160,172,190,180,149,115,101,84,73,65,57,52,55,55,52,49,41,35,29,23,20,16,16,17,16,15,15,13,12,13,13,10,7,7,13,
+27,30,40,62,71,66,62,55,51,48,57,75,83,106,163,201,206,161,127,105,65,51,43,33,26,30,33,57,105,136,161,186,199,246,255,255,255,255,255,255,255,255,255,254,213,167,228,252,
+253,246,248,253,250,239,250,255,255,255,255,255,255,255,255,255,254,254,254,253,236,186,175,170,79,37,38,42,34,24,21,17,14,14,16,20,28,37,43,47,50,47,44,41,35,36,36,33,
+29,23,20,16,10,12,14,16,14,10,7,3,0,0,0,0,0,0,0,2,9,23,35,45,56,70,99,147,171,184,207,221,218,218,226,236,241,241,252,254,235,192,161,115,70,51,62,83,
+80,61,45,48,63,94,125,112,128,162,126,97,90,76,69,75,76,76,82,120,150,149,150,171,172,169,198,233,238,238,234,253,255,255,255,255,255,255,255,253,246,241,235,219,233,235,224,199,
+184,183,168,134,95,69,65,49,17,13,10,0,7,16,16,22,14,12,30,62,86,95,105,82,54,37,45,65,102,183,194,197,191,155,136,128,105,84,71,62,55,52,52,51,48,41,35,31,
+27,21,19,20,20,16,15,14,12,10,9,8,6,0,1,10,19,19,26,44,62,61,52,47,61,59,58,75,73,94,164,171,168,146,142,184,165,137,91,55,47,49,57,70,95,130,165,211,
+234,250,255,255,255,246,242,246,254,250,231,222,197,221,255,252,224,239,254,253,254,255,255,255,255,255,255,255,255,255,255,255,255,253,253,247,242,173,128,136,62,42,43,41,30,26,23,20,
+17,19,19,23,31,42,48,51,52,51,47,44,42,37,36,34,31,26,20,16,9,9,9,12,13,13,8,1,0,0,0,0,0,0,5,13,27,41,49,57,68,79,111,149,171,196,222,217,
+200,193,207,215,213,219,240,242,247,208,155,142,80,31,38,57,58,43,37,44,57,76,105,132,155,143,162,157,133,106,95,87,90,97,119,151,205,214,194,186,212,236,246,255,255,253,239,248,
+255,255,255,255,255,255,255,252,250,248,246,245,242,222,204,187,203,198,173,153,102,69,72,56,23,15,7,0,0,0,1,16,12,5,22,38,57,77,77,52,38,26,33,54,121,185,196,183,
+176,171,158,167,158,127,106,82,66,63,58,59,56,45,38,35,28,22,21,21,21,20,19,16,15,14,9,8,5,2,1,10,16,19,27,41,51,58,55,45,54,78,93,77,66,66,83,100,
+139,178,167,163,224,247,198,108,100,88,94,91,106,120,153,203,236,253,255,255,235,219,222,234,248,236,192,182,182,243,255,236,232,250,255,255,255,255,255,255,255,255,255,255,255,255,254,254,
+253,253,255,240,190,109,64,56,57,48,40,40,33,30,24,23,24,24,27,30,37,47,55,56,54,50,49,49,47,43,37,36,33,27,21,15,12,9,8,10,12,10,2,0,0,0,0,0,
+0,6,16,26,38,42,52,68,83,107,139,171,190,201,204,191,180,180,186,175,186,196,212,226,238,172,121,129,79,30,40,57,64,58,52,51,64,84,108,151,170,153,187,205,185,163,143,106,
+105,130,196,229,245,246,236,234,250,254,255,255,255,255,253,254,239,238,252,255,255,255,255,254,253,253,249,248,234,200,180,184,214,197,179,183,113,64,71,48,21,14,10,2,0,0,2,15,
+16,20,29,36,55,70,64,41,33,26,27,61,134,182,198,194,194,193,176,201,218,192,153,120,90,76,72,78,66,52,45,37,31,24,22,24,23,22,21,19,15,15,14,9,6,5,5,6,
+12,21,37,62,77,77,63,55,54,79,147,99,70,61,79,116,171,189,194,222,227,233,255,210,204,142,111,126,151,116,139,171,213,226,206,220,191,179,199,192,213,236,210,177,186,224,240,233,
+241,252,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,253,219,134,80,56,43,43,48,55,55,44,38,36,33,31,29,29,30,38,44,51,58,57,56,49,50,50,48,45,42,37,
+33,29,23,17,14,12,12,13,10,6,0,0,0,0,0,0,0,8,16,16,26,37,54,70,100,147,191,183,171,196,194,164,153,154,154,125,151,189,199,225,241,191,135,104,64,51,63,82,
+88,73,68,68,84,98,121,153,157,173,228,234,206,218,199,176,177,185,242,255,254,255,254,255,255,255,255,255,255,255,254,238,201,203,234,248,255,255,254,254,254,253,249,248,219,179,194,210,
+213,183,167,189,155,84,57,44,28,17,13,8,3,17,37,37,37,47,48,49,59,58,52,36,24,24,33,77,147,212,232,228,221,220,214,229,232,210,165,151,130,107,106,106,76,58,50,42,
+36,28,27,28,27,24,24,22,19,17,14,12,7,3,3,7,10,19,30,50,75,82,52,47,43,42,172,144,76,87,139,154,218,197,221,255,254,205,215,231,234,163,142,151,156,126,177,199,
+187,158,135,135,125,155,186,163,199,226,201,187,176,185,203,205,222,255,255,245,254,255,255,255,255,255,255,255,255,255,255,254,255,241,139,78,64,58,47,41,45,65,58,50,44,42,45,47,
+42,37,40,50,54,56,61,59,55,45,43,45,45,43,42,41,36,33,26,22,20,17,19,17,10,0,0,0,0,0,0,0,0,5,8,10,20,29,43,68,102,141,170,140,139,167,172,135,
+139,155,155,129,169,212,207,217,234,227,172,115,88,85,85,100,94,77,73,79,97,113,135,151,149,173,219,232,227,233,232,228,227,221,248,254,255,255,255,254,255,255,254,254,254,254,245,231,
+229,238,245,249,255,255,254,254,254,254,253,245,212,203,225,224,221,192,170,204,186,130,94,64,42,17,13,19,23,31,62,72,56,63,64,65,58,34,33,28,26,29,57,115,162,210,215,214,
+200,194,211,227,215,187,162,173,184,163,153,127,90,73,62,50,43,36,31,31,31,31,29,26,23,22,15,12,9,7,5,8,13,16,20,30,62,76,49,41,34,23,92,175,139,164,231,196,
+167,167,206,250,255,200,194,201,240,199,183,165,142,158,219,219,184,151,150,126,119,160,182,164,183,192,171,162,163,183,204,189,179,210,186,179,253,255,255,255,255,255,255,255,255,255,255,255,
+255,243,157,91,80,77,55,41,44,55,45,51,50,51,47,45,65,61,62,66,58,64,68,61,54,44,41,41,44,45,42,40,35,31,28,24,22,21,20,16,8,0,0,0,0,0,0,0,
+0,0,6,13,19,26,36,59,105,143,140,130,177,157,136,147,157,164,173,180,207,222,214,204,208,210,178,133,116,97,85,91,80,99,107,98,123,143,162,161,162,194,213,227,238,240,250,248,
+239,241,250,253,253,254,253,252,253,254,248,250,250,249,234,242,255,255,255,255,255,255,255,255,255,255,254,254,241,228,227,232,226,218,204,207,208,186,132,76,61,38,34,51,55,37,69,88,
+73,73,70,66,58,42,34,24,30,38,69,118,153,172,190,183,189,189,192,206,194,172,165,189,193,186,164,127,108,98,78,59,48,42,37,37,38,38,33,30,26,24,21,16,15,13,12,14,
+14,15,20,23,44,56,35,30,29,36,88,157,189,220,249,236,163,175,203,232,247,255,254,211,191,182,191,190,165,193,239,220,189,156,134,115,114,143,149,144,160,170,155,153,167,184,194,196,
+146,132,128,164,214,245,250,254,255,255,255,255,255,255,255,255,250,211,147,109,101,88,64,54,56,54,45,42,50,58,58,55,92,94,93,73,54,69,76,59,44,47,42,38,41,42,38,37,
+35,34,30,23,20,19,17,13,5,0,0,0,0,0,0,0,0,0,3,13,22,29,36,55,113,158,154,162,169,128,160,186,186,171,187,210,211,208,214,200,193,150,120,106,92,80,80,85,
+119,150,147,142,134,163,186,205,208,219,218,226,241,248,254,255,254,250,253,252,248,241,233,240,241,239,243,246,246,240,229,247,255,255,253,255,255,255,255,255,255,255,255,255,253,247,240,233,
+231,226,218,191,185,168,120,69,66,62,66,77,69,59,94,92,71,70,64,63,59,49,41,28,27,40,55,85,129,144,167,194,206,208,213,210,199,193,200,214,207,201,170,127,114,101,75,62,
+55,45,43,43,44,44,42,38,35,35,30,27,26,22,19,20,17,20,20,19,24,28,17,12,19,44,84,93,97,148,190,222,146,160,186,163,212,254,229,148,126,127,183,214,198,184,160,146,
+141,113,82,83,94,132,155,125,167,198,146,160,179,196,185,196,137,146,150,175,173,192,219,245,255,255,255,255,255,255,255,255,198,146,147,148,143,119,88,80,70,88,88,59,61,65,66,70,
+84,123,114,62,72,84,70,57,43,43,40,37,37,36,38,40,36,35,30,22,19,16,13,8,3,1,0,0,0,0,0,0,0,0,3,13,23,31,34,48,87,144,182,199,164,165,187,198,
+183,168,198,206,185,192,212,211,183,123,101,83,61,70,84,100,126,129,144,139,127,155,207,231,238,234,226,227,239,250,255,255,255,254,252,249,246,233,219,212,185,179,196,194,219,239,238,250,
+254,254,252,254,254,255,255,254,255,255,255,255,255,254,250,238,242,233,215,153,149,153,132,92,65,54,63,83,87,77,87,80,52,51,50,57,50,38,35,31,35,40,51,66,105,130,154,217,
+214,193,191,189,199,212,215,220,218,190,139,135,127,92,75,64,55,50,48,49,51,51,52,51,48,45,41,38,36,33,26,24,23,22,20,16,13,9,6,7,14,20,33,57,69,84,107,149,
+113,134,169,129,157,220,222,155,123,115,147,182,169,171,135,119,102,77,64,71,78,109,134,122,185,215,142,142,142,143,140,113,123,142,135,158,149,167,233,254,255,255,255,255,255,255,255,255,
+184,130,160,185,172,147,111,95,91,135,142,106,73,73,77,72,95,134,143,93,87,72,58,55,44,40,35,40,40,34,36,41,35,33,27,20,16,13,9,5,3,0,0,0,0,0,0,0,
+0,0,2,13,21,28,30,36,57,76,130,224,227,196,187,197,175,151,196,168,120,143,180,180,163,118,101,76,58,62,91,126,132,153,182,180,191,208,241,250,252,246,235,231,240,252,253,254,
+254,250,249,248,240,241,228,193,148,137,151,151,161,213,236,236,242,241,246,252,254,253,254,253,252,254,254,254,254,255,254,253,242,236,225,173,161,155,130,101,61,65,99,99,72,79,66,62,
+31,30,40,44,41,34,28,26,28,28,40,55,86,107,127,175,184,144,123,135,162,201,206,192,211,189,149,161,142,105,86,68,58,54,54,54,56,56,57,58,57,54,48,43,41,36,30,28,
+24,21,16,10,6,1,0,5,10,15,21,44,65,73,100,122,108,121,115,104,127,156,179,156,123,123,137,147,154,171,147,102,83,75,68,73,80,99,102,101,168,227,151,149,135,100,102,77,
+93,100,104,122,132,201,255,255,255,255,255,255,255,255,255,255,224,155,171,184,169,162,120,101,120,141,153,116,73,73,78,79,113,147,163,126,75,71,61,57,51,44,43,42,38,34,38,37,
+34,27,23,20,17,17,10,5,2,0,0,0,0,0,0,0,0,0,6,14,21,28,29,33,48,90,136,194,201,187,200,198,161,150,169,114,85,99,129,156,161,122,106,105,104,109,135,168,
+182,194,201,212,235,253,255,255,255,253,246,246,243,247,252,255,246,235,243,243,228,210,162,153,132,101,106,119,158,207,226,173,189,179,192,228,249,252,252,252,248,248,252,250,253,255,255,252,
+243,231,229,212,171,143,120,114,116,120,120,94,31,62,91,76,38,24,35,36,36,29,22,13,9,12,23,37,62,95,121,122,121,120,106,134,163,179,198,194,210,185,165,165,121,107,85,71,
+65,62,57,57,56,57,59,61,61,55,49,42,40,35,29,26,23,17,14,7,1,0,0,3,8,12,19,30,47,73,92,118,119,108,85,87,95,109,127,128,121,136,137,144,171,155,111,88,
+85,75,71,79,87,105,132,133,167,211,158,172,140,91,77,73,76,66,83,123,160,222,255,255,255,255,255,255,255,255,255,255,245,168,170,185,175,169,126,111,128,118,135,101,75,72,83,79,
+106,130,133,118,78,72,62,62,52,45,43,40,41,37,41,34,30,28,24,22,29,29,10,3,0,0,0,0,0,0,0,0,1,3,12,21,28,33,34,36,56,105,148,177,191,215,224,201,
+187,193,148,80,70,95,168,189,167,146,136,153,158,169,184,199,203,218,232,240,250,255,255,255,255,254,246,221,204,222,243,252,242,229,224,210,193,184,156,120,109,88,87,141,197,193,171,146,
+192,170,199,225,240,249,249,249,247,245,229,221,243,250,252,250,239,219,191,149,120,121,136,141,150,164,106,47,35,58,87,77,57,44,40,35,33,28,20,8,5,8,19,34,61,104,132,115,
+105,104,122,158,183,192,199,205,211,198,193,179,127,102,90,78,73,72,61,56,56,59,62,62,59,54,45,38,34,28,27,22,17,14,12,6,3,0,0,0,2,9,16,27,41,63,90,101,
+91,75,72,82,92,101,111,111,105,109,127,156,178,144,105,93,97,95,94,102,120,130,169,187,228,222,213,190,118,80,64,63,62,61,87,130,185,245,255,255,255,255,255,255,255,254,245,253,
+222,175,171,192,194,183,128,114,109,100,125,101,62,69,78,86,94,87,104,132,109,72,65,55,42,35,43,57,61,48,41,31,27,31,29,27,31,27,9,2,0,0,0,0,0,0,0,3,
+7,13,23,28,34,37,41,41,64,108,125,141,193,236,205,173,208,210,165,94,80,115,190,208,197,190,178,180,186,194,213,225,234,246,252,254,255,255,255,255,255,249,222,175,190,232,242,236,
+232,227,198,177,155,161,189,165,119,85,79,147,172,189,182,169,235,217,200,220,242,254,253,250,248,213,173,177,224,242,242,246,234,221,184,111,107,153,164,125,120,154,146,92,79,83,90,62,
+49,31,31,33,31,26,17,7,1,7,19,38,71,115,146,136,126,113,121,141,157,182,204,211,210,206,206,190,136,95,97,85,77,71,62,57,57,61,63,61,57,51,45,36,31,27,24,21,
+14,9,9,8,6,1,0,0,1,8,19,28,38,49,68,72,68,69,72,79,91,100,99,95,92,95,125,148,137,116,105,102,142,134,120,162,198,165,180,240,255,241,208,190,129,75,64,59,
+57,64,98,126,200,255,254,255,255,255,255,255,255,254,249,246,212,189,200,213,197,158,125,101,93,91,82,73,71,80,73,83,101,119,128,136,108,50,59,57,40,31,45,65,59,40,30,27,
+22,28,31,23,19,15,8,2,0,0,0,0,1,6,8,13,17,26,33,35,42,44,48,48,65,94,115,143,187,227,196,184,199,192,162,123,139,150,175,186,190,191,196,197,200,208,225,238,
+248,254,255,255,255,255,255,255,254,246,203,173,206,227,235,228,233,233,206,179,133,72,111,155,114,73,57,83,120,207,255,254,246,212,186,227,247,255,255,255,242,182,139,158,224,245,245,241,
+242,240,203,151,175,190,167,133,162,148,114,104,116,98,64,33,17,15,22,26,27,19,13,6,2,7,23,51,77,106,144,135,142,144,153,143,151,175,205,201,204,203,200,182,143,121,111,94,
+85,73,65,63,62,63,64,64,57,51,45,35,31,28,26,22,14,9,8,9,8,3,0,0,0,8,20,26,36,48,58,65,63,64,70,78,84,97,94,86,85,91,112,136,112,97,111,105,
+155,137,122,167,227,226,220,247,255,246,178,143,119,79,65,66,72,77,94,118,201,255,247,247,245,255,255,254,246,249,253,252,225,218,215,210,157,125,107,98,102,82,62,76,77,72,80,104,
+123,143,165,114,62,49,62,61,52,55,54,54,45,28,26,21,14,13,14,12,10,12,7,1,0,0,1,2,9,17,23,26,29,31,38,48,58,58,56,54,62,85,113,155,198,218,183,190,
+193,167,126,129,139,144,146,148,176,208,224,217,212,224,238,249,255,255,255,255,255,254,252,248,245,242,229,224,236,239,224,224,232,212,154,106,92,47,58,78,63,47,42,47,83,187,255,255,
+253,247,250,255,255,255,255,253,252,217,185,191,229,247,249,246
+};
+
+
+unsigned char stringymap[TEXSIZE * TEXSIZE] = {
+79,86,98,116,137,155,173,189,207,226,243,251,247,231,201,157,106,64,37,19,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,7,27,49,70,112,175,212,224,233,236,231,225,215,207,209,215,221,232,242,248,251,251,252,251,251,248,246,246,246,246,246,246,246,246,246,246,246,246,246,246,247,248,248,249,240,
+229,227,227,235,249,250,235,225,228,235,238,243,247,248,246,240,225,198,164,135,109,81,54,39,37,39,45,54,64,70,72,73,80,86,93,103,112,117,118,118,118,118,119,116,106,91,78,69,
+57,43,30,17,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,4,15,32,49,57,59,59,59,59,58,56,59,67,76,85,93,102,118,145,174,200,222,238,245,246,239,220,186,143,103,62,31,13,5,1,0,0,0,0,3,34,83,117,121,105,
+85,71,63,53,46,41,41,41,41,41,45,54,64,69,70,71,114,133,157,179,200,217,231,240,243,242,230,201,159,121,98,87,86,87,84,76,62,46,32,18,8,2,0,0,0,0,0,0,
+0,0,0,0,0,4,11,18,23,27,34,39,40,39,38,39,47,64,97,140,183,209,219,227,215,184,164,139,113,94,79,68,65,78,99,121,146,170,189,198,202,207,208,207,202,204,211,213,
+212,212,212,212,212,212,212,212,212,212,212,213,213,212,213,200,182,169,153,142,138,137,140,159,188,200,202,187,158,173,203,218,227,238,242,234,228,223,205,162,119,94,82,80,78,76,76,75,
+71,66,63,57,52,50,49,48,47,46,46,48,53,62,69,77,83,85,82,74,60,45,32,20,11,7,4,3,2,2,3,3,3,3,1,2,3,6,13,19,24,27,32,37,39,39,40,41,
+42,42,40,38,31,18,7,1,0,0,0,0,0,1,3,8,15,26,43,60,77,87,88,85,84,84,84,85,87,98,115,122,120,118,118,119,120,124,130,142,158,178,196,214,233,247,250,245,
+232,205,167,131,96,59,29,13,4,0,0,0,10,25,40,54,67,74,80,84,85,85,85,85,85,85,85,83,81,83,91,102,205,223,237,244,244,239,228,211,190,159,113,64,28,14,14,22,
+34,48,62,76,86,91,91,85,75,63,51,42,35,35,40,42,42,38,30,30,40,55,69,78,82,84,86,84,83,91,110,137,177,212,238,243,229,204,184,152,108,74,61,54,51,54,59,70,
+84,104,124,131,118,94,77,68,63,61,61,59,61,72,89,93,90,90,90,90,90,90,90,90,90,90,90,94,100,105,108,111,117,118,105,74,42,18,6,6,21,35,41,28,7,17,36,46,
+54,74,95,93,93,111,156,204,206,179,122,74,45,38,46,51,52,53,52,50,47,46,45,41,34,25,15,7,4,9,19,34,54,70,83,97,109,118,122,124,123,117,111,104,99,100,103,104,
+105,101,96,97,103,111,122,126,123,117,109,102,98,95,92,90,90,87,85,86,84,76,65,53,47,46,46,47,51,56,63,75,90,109,129,135,120,89,60,42,33,30,28,28,31,46,66,71,
+67,66,65,65,64,63,63,63,65,71,81,99,127,163,198,224,241,249,250,242,227,199,161,128,99,77,60,49,44,44,45,45,41,40,48,56,63,69,70,70,71,74,77,84,102,132,162,185,
+251,245,233,218,201,183,164,146,130,111,86,63,48,41,40,41,43,47,53,62,75,90,109,134,149,148,142,131,121,119,123,125,125,115,96,87,88,87,79,68,60,55,52,68,105,159,210,233,
+236,210,167,124,101,102,119,129,126,117,111,111,116,117,114,110,110,115,120,121,110,91,74,59,42,27,13,3,0,0,2,4,4,4,4,4,4,4,4,4,4,4,4,6,8,12,18,30,
+51,79,107,120,113,91,65,41,21,6,0,0,0,0,0,0,0,0,0,0,0,0,18,54,78,125,182,193,177,139,102,105,110,112,114,114,114,114,113,111,105,96,83,82,82,84,106,133,
+156,166,171,178,193,207,220,233,240,242,240,238,236,236,237,237,237,236,233,232,233,234,233,231,224,213,194,177,166,157,145,126,103,84,71,68,76,94,116,129,129,120,113,112,115,117,112,109,
+108,113,119,119,108,90,73,58,42,27,13,4,0,0,2,5,6,7,11,17,24,29,32,33,40,58,79,90,102,127,164,196,216,233,244,249,252,253,249,242,232,220,207,199,195,195,194,186,
+166,152,152,153,154,160,164,165,167,172,182,198,220,240,249,252,174,152,127,111,100,93,89,91,99,108,116,119,118,115,114,114,114,114,114,114,115,119,126,136,140,135,126,117,113,109,105,104,
+104,95,75,58,44,30,16,16,37,67,110,175,220,229,198,150,102,55,37,42,60,87,114,129,126,108,95,92,92,88,75,60,47,37,35,40,51,64,75,84,87,83,73,57,37,20,7,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,34,66,96,114,120,115,102,81,58,42,29,19,13,11,11,11,14,22,33,43,53,65,77,94,121,151,181,166,111,100,
+94,89,88,88,88,88,88,93,100,110,144,202,222,223,236,248,252,253,253,253,253,253,252,250,246,243,242,241,241,240,239,239,239,238,235,234,232,230,229,230,234,239,243,244,241,239,235,223,
+204,183,167,156,150,150,154,156,146,125,111,110,109,105,94,81,69,61,58,62,72,83,93,100,103,100,91,78,63,52,48,56,74,86,99,122,142,154,159,162,171,194,214,219,222,228,235,239,
+239,241,245,248,251,253,255,255,255,255,255,254,254,253,253,253,248,243,243,244,244,246,247,249,250,252,253,253,248,234,215,195,34,23,16,14,13,13,13,17,24,34,50,67,80,87,88,88,
+88,87,87,87,87,86,81,71,58,47,37,33,31,30,26,24,23,18,7,0,4,27,66,123,182,216,229,213,162,102,50,29,34,51,73,86,89,89,89,95,97,92,86,85,84,82,78,71,
+61,47,31,19,14,15,21,34,50,69,86,97,99,91,74,51,32,20,15,13,13,13,13,15,22,32,38,41,41,40,35,28,18,8,3,8,21,43,67,89,108,120,120,115,106,95,86,83,
+82,85,90,100,110,116,120,120,116,107,93,78,63,46,31,23,18,15,14,14,14,14,14,17,23,36,123,239,255,252,240,223,207,197,196,194,187,176,165,149,133,122,116,114,112,112,110,109,
+109,106,100,97,95,94,95,99,109,129,154,171,181,193,208,226,239,247,249,249,245,237,226,215,203,190,185,185,184,183,182,178,173,167,161,158,157,160,164,170,180,190,197,199,199,199,199,204,
+217,224,229,238,243,244,244,244,246,244,238,232,230,222,204,188,180,175,172,172,175,182,191,201,213,222,229,232,233,231,229,225,213,206,207,210,211,211,209,207,204,199,187,169,143,106,71,50,
+0,0,0,0,0,0,0,0,0,0,0,3,8,12,13,13,13,15,17,17,18,22,27,32,38,42,42,42,41,40,39,38,37,40,53,75,121,182,220,230,208,168,128,84,52,46,56,74,
+87,92,86,77,76,81,90,94,85,77,74,74,74,74,75,78,85,88,85,76,63,49,42,43,49,61,78,97,116,133,141,134,114,91,77,73,72,72,73,75,81,86,87,88,88,88,87,84,
+78,66,50,35,22,20,23,27,38,56,76,90,101,111,115,116,116,116,113,107,96,86,74,60,45,33,20,11,4,0,0,0,0,0,0,0,0,0,0,0,0,0,55,167,197,160,114,78,
+57,49,50,49,45,41,42,43,46,47,48,47,46,46,46,46,45,40,30,21,17,17,17,18,21,29,42,58,74,92,115,143,166,184,195,204,217,233,243,248,250,249,249,250,250,249,250,250,
+251,252,252,250,249,246,244,244,246,247,249,251,253,254,255,253,247,240,233,221,208,200,196,194,191,177,158,148,144,134,121,110,102,93,80,67,57,56,58,62,71,88,108,123,134,141,145,143,
+136,131,129,123,113,103,92,80,68,57,43,28,15,4,0,0,0,0,0,0,0,0,0,0,3,4,4,4,8,10,11,13,19,31,38,40,45,55,67,78,84,87,86,84,83,82,88,105,
+129,170,212,233,243,230,194,150,108,84,77,79,87,95,100,98,92,86,82,84,89,89,77,52,28,17,15,15,15,15,15,20,29,43,61,75,85,88,87,87,87,85,85,87,92,101,112,119,
+113,94,78,74,74,75,75,73,66,55,47,44,44,46,50,60,70,81,87,87,81,78,72,53,34,27,28,33,40,49,55,57,56,52,43,30,20,12,8,3,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,3,4,11,41,57,38,20,15,18,29,37,39,43,53,66,76,82,85,86,86,86,86,86,86,86,85,82,75,72,71,71,70,71,72,75,80,87,93,99,99,
+98,99,105,115,129,143,151,155,165,172,174,174,174,173,175,175,178,182,188,194,198,201,201,200,199,196,192,193,193,190,188,182,165,146,128,113,101,96,94,91,82,66,53,47,46,46,49,58,
+67,78,85,84,78,76,70,52,32,26,28,32,40,48,54,55,55,51,42,30,20,12,7,2,0,0,0,0,0,0,0,0,1,4,8,11,12,13,24,41,53,57,58,61,67,71,72,74,
+79,86,87,88,88,87,80,67,52,43,43,56,74,98,146,202,230,236,215,181,149,112,86,81,84,89,88,83,82,88,93,95,96,93,87,75,59,39,19,4,0,0,0,0,0,0,0,0,
+0,0,7,15,26,40,49,53,53,48,42,40,42,44,47,48,47,41,33,30,28,24,20,15,8,3,1,0,0,0,2,5,11,22,37,53,66,74,78,67,54,50,49,48,47,46,46,45,
+44,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,8,11,12,13,24,41,53,57,57,58,64,69,71,73,79,85,87,87,87,86,80,68,55,47,44,43,44,44,44,44,
+45,51,63,72,75,76,77,82,89,91,90,84,81,88,93,94,95,91,85,74,58,41,28,22,26,33,34,34,34,34,34,35,35,36,41,47,57,67,75,77,78,72,66,64,65,66,64,60,
+55,45,36,31,27,23,19,14,7,2,0,0,0,0,2,5,11,22,37,53,65,74,78,67,54,49,48,47,46,45,45,45,44,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,
+34,40,45,48,48,52,68,86,88,86,85,83,80,76,76,74,68,56,46,42,37,29,18,16,31,57,102,156,192,214,230,209,157,105,53,26,17,13,22,47,65,69,67,63,59,59,59,60,
+57,47,32,16,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,29,42,45,45,43,44,46,48,49,49,48,48,47,47,44,39,30,16,3,0,0,0,0,0,0,0,
+0,0,0,3,8,13,16,17,18,25,31,35,37,41,42,42,42,27,4,0,0,0,0,0,0,0,0,0,0,1,9,19,34,40,45,48,48,52,68,86,88,86,85,83,79,76,76,74,
+68,56,47,43,41,33,21,10,3,0,0,0,0,0,0,0,0,2,7,12,15,15,24,48,65,69,67,63,59,59,59,60,57,47,31,16,6,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,7,28,41,44,43,41,42,45,46,47,48,47,47,47,46,43,38,30,16,3,0,0,0,0,0,0,0,0,0,0,3,8,13,16,17,18,25,31,35,37,41,42,42,
+42,27,4,0,0,0,0,0,0,0,0,0,0,1,9,18,51,44,38,34,33,35,41,42,35,29,28,24,18,14,13,12,8,2,5,18,36,53,76,124,179,212,228,219,192,160,115,55,
+13,0,0,0,0,0,5,28,38,34,33,30,23,14,9,6,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,33,44,43,42,42,42,38,35,33,33,
+33,33,33,35,39,44,50,51,39,18,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,5,6,6,6,3,0,0,0,0,0,0,0,0,0,0,8,28,44,52,
+51,44,38,34,34,35,41,42,35,29,28,25,20,16,15,15,11,5,1,1,3,4,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,5,28,38,34,33,30,23,14,9,6,
+4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,33,44,43,42,42,41,38,35,33,33,33,33,33,35,39,44,50,51,39,18,4,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,3,5,5,6,6,3,0,0,0,0,0,0,0,0,0,0,8,27,44,51,10,4,0,0,0,0,0,0,0,0,0,0,5,14,28,45,
+59,80,122,166,196,214,228,237,223,192,155,103,64,41,27,20,21,23,24,25,24,23,21,17,10,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,2,7,9,6,6,6,5,4,2,1,1,1,1,1,2,4,8,17,33,49,51,38,20,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,3,10,23,43,52,42,28,14,7,3,2,1,1,1,0,0,0,0,0,2,7,13,18,23,24,27,33,41,50,56,58,57,52,44,37,31,27,24,23,
+24,24,24,24,24,23,20,16,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,7,9,6,6,6,5,4,2,1,1,
+1,1,1,1,2,5,13,29,46,47,35,17,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,20,39,49,38,25,
+25,25,25,25,27,31,32,34,41,58,84,115,137,157,183,206,220,232,245,241,230,220,207,186,159,138,124,115,108,103,102,103,104,105,105,107,106,105,97,77,52,38,35,35,36,34,28,21,
+15,10,5,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,15,34,49,52,38,18,7,4,
+4,5,6,10,14,20,24,25,25,25,25,21,16,10,5,5,5,4,2,1,1,4,9,15,25,36,46,52,47,26,7,0,0,0,0,0,0,0,0,0,6,16,26,40,56,72,85,97,
+103,105,108,115,121,128,130,130,128,125,120,114,109,103,100,100,102,103,104,105,106,105,99,82,62,53,52,54,58,61,57,43,25,10,2,0,0,1,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,22,27,40,57,70,71,58,41,33,32,32,33,33,36,39,44,46,47,47,47,47,45,40,35,31,30,
+30,30,28,28,28,30,33,39,46,56,66,72,68,50,33,25,182,181,181,181,184,190,193,197,205,220,233,244,247,247,244,236,229,219,201,177,163,154,149,144,142,143,143,144,145,145,147,148,
+150,151,152,153,154,155,154,149,137,128,125,125,125,124,115,105,95,82,68,58,56,57,56,47,40,39,39,38,37,37,38,38,37,33,25,13,3,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,12,33,52,58,59,64,68,70,70,73,78,83,83,83,84,84,83,81,75,61,45,41,41,39,34,32,34,39,46,50,51,47,37,25,11,1,0,0,
+0,0,0,2,9,18,29,45,67,90,109,125,139,146,151,153,153,151,149,148,146,143,140,138,137,136,137,137,137,139,140,142,145,147,149,153,159,168,182,194,200,201,204,208,210,213,211,203,
+185,153,125,95,72,61,54,45,39,38,38,38,37,37,38,38,37,33,25,13,3,0,0,0,0,0,0,0,0,0,0,0,5,21,40,68,115,155,177,182,181,183,188,194,199,197,194,195,
+196,197,197,200,202,205,206,206,206,206,206,205,202,197,194,192,192,191,189,189,190,192,195,197,200,199,198,193,187,182,182,181,201,204,208,214,220,224,227,230,231,227,218,206,197,189,178,164,
+154,146,137,128,119,111,103,100,101,107,112,117,122,127,130,131,134,136,137,140,144,151,155,156,156,156,155,155,155,157,157,158,157,154,149,144,142,143,142,137,130,126,126,126,126,128,130,131,
+130,126,115,91,59,43,41,41,41,41,43,46,40,26,13,7,5,5,5,5,5,5,5,5,4,4,5,19,49,86,113,125,125,117,102,90,82,71,63,61,61,61,62,66,70,61,47,43,
+43,46,47,49,48,44,38,31,22,11,3,0,0,0,0,0,7,18,32,50,73,95,113,130,145,154,157,158,158,155,151,146,141,136,132,125,116,106,98,93,94,98,103,108,113,118,122,125,
+128,131,134,137,143,153,163,173,181,186,186,183,180,179,179,187,201,217,224,225,219,204,177,152,136,126,122,121,121,124,127,128,127,123,113,88,56,40,38,38,41,42,51,70,67,54,63,93,
+129,169,201,219,230,220,206,201,201,200,200,203,212,222,229,232,232,229,224,220,217,214,212,211,211,211,212,213,214,212,210,209,209,209,211,211,211,210,206,204,202,201,199,199,199,198,199,198,
+97,118,138,153,162,166,168,169,169,163,152,138,123,107,91,78,68,62,58,51,41,32,25,23,24,29,34,40,47,53,56,57,58,60,61,63,69,87,104,103,92,85,83,83,84,88,96,106,
+117,129,139,143,144,146,149,145,135,130,129,130,134,143,151,156,159,160,160,153,130,116,114,114,114,114,117,120,111,89,73,63,58,58,58,58,58,58,58,58,58,58,60,71,84,93,90,81,
+70,54,37,26,17,11,7,6,6,6,6,9,12,11,7,6,6,8,11,12,12,8,3,0,0,0,0,0,0,7,16,34,65,94,117,134,148,155,158,159,159,155,147,137,123,107,92,78,
+68,62,56,49,39,31,24,22,22,26,31,37,43,49,53,54,57,58,60,62,68,86,103,102,90,83,82,81,83,87,95,104,117,131,145,160,175,197,222,228,222,209,196,187,172,164,168,172,
+173,173,173,167,146,132,136,155,185,187,205,231,226,214,224,236,238,227,207,185,148,113,95,90,90,90,92,101,111,116,113,103,94,81,67,58,52,48,44,44,44,44,44,46,48,47,45,43,
+43,45,47,48,48,45,42,40,39,38,37,37,39,45,56,68,139,149,154,156,156,152,146,135,117,93,72,54,38,25,16,10,6,4,4,3,3,3,3,4,4,4,5,6,8,9,9,9,
+10,10,11,12,14,22,34,39,38,36,36,35,35,37,42,47,53,65,75,80,81,85,88,79,65,56,52,49,52,61,73,87,99,104,102,97,91,88,88,88,87,87,89,89,82,74,77,82,
+85,85,85,85,85,85,85,85,85,85,84,78,62,42,23,11,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,14,35,65,89,115,
+141,154,158,159,158,154,147,137,118,94,73,55,38,25,17,11,7,5,4,3,1,0,0,0,0,0,0,1,3,4,4,4,5,4,5,5,7,13,21,20,14,10,10,10,10,12,16,22,
+30,41,53,58,59,65,83,95,105,135,154,167,185,196,200,205,210,212,211,210,207,219,237,247,248,232,243,235,218,207,193,168,143,120,101,90,84,81,80,81,81,81,80,74,59,39,20,8,
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,30,61,91,112,159,155,147,135,116,92,72,53,34,18,8,2,0,0,0,2,
+11,21,29,38,49,58,65,69,70,69,69,69,69,69,68,69,69,70,70,74,77,83,101,120,129,131,131,131,131,131,131,131,131,131,132,133,133,133,132,126,116,106,92,77,71,69,65,57,
+47,35,26,19,15,13,12,13,13,14,14,13,11,11,17,24,28,29,29,29,29,29,29,29,29,29,26,18,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,4,14,30,53,84,118,143,154,158,158,156,148,135,116,92,72,53,34,18,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,3,2,0,0,0,5,12,32,53,56,58,62,63,63,62,61,95,136,122,87,74,96,76,51,42,35,29,
+27,26,26,27,27,28,28,28,28,28,26,18,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14,29,53,84,117,143,155,158,
+126,101,73,50,32,17,8,1,0,0,0,0,21,52,84,113,136,147,149,159,173,183,190,193,193,193,193,193,194,194,193,193,193,194,195,198,200,205,217,229,232,233,234,234,233,233,233,233,
+232,232,232,233,232,232,231,229,226,220,211,200,194,191,184,168,144,115,88,64,41,22,9,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,9,17,31,54,84,112,136,152,158,158,152,139,124,105,76,50,32,17,8,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,5,9,17,31,54,84,112,136,152,158,159,155,148,39,20,5,0,0,0,0,0,4,23,66,129,184,218,235,243,246,243,242,243,245,247,247,248,248,248,248,247,247,248,248,248,
+248,248,248,247,247,247,247,243,240,239,239,239,238,238,239,239,239,238,239,239,239,238,239,241,243,244,247,247,248,247,246,245,238,225,209,190,160,123,93,67,42,18,4,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,4,4,4,4,4,4,4,5,7,10,16,22,27,35,49,62,76,94,116,136,152,158,159,157,147,123,90,62,
+41,24,10,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,1,3,3,3,3,3,3,3,3,3,5,9,16,22,26,35,49,62,76,94,116,136,152,158,159,157,149,130,99,72,6,12,20,25,28,34,50,89,133,180,225,250,253,247,238,232,
+229,227,225,222,216,213,209,206,206,206,205,205,205,205,205,205,205,205,204,202,199,196,183,165,153,149,149,149,148,148,149,149,149,148,148,149,149,148,151,156,164,174,187,200,206,207,213,225,
+238,245,248,248,241,227,211,191,157,106,57,25,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,14,23,32,44,55,61,62,62,62,62,62,62,62,64,69,80,93,103,
+110,121,134,143,149,155,159,159,157,150,134,110,75,43,20,8,1,0,0,0,0,0,0,0,0,0,1,3,8,16,22,26,25,20,12,6,3,1,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,7,16,24,24,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,10,22,28,33,40,48,55,66,75,79,80,80,80,80,80,80,80,80,81,84,93,101,108,120,132,141,148,153,156,157,155,147,131,105,75,46,23,11,
+136,156,173,183,188,197,214,238,252,255,254,241,212,178,149,134,129,125,120,111,103,94,88,86,87,87,86,84,84,84,84,84,84,84,83,79,77,72,61,46,37,34,34,34,34,34,34,34,
+34,34,34,34,34,34,36,39,45,53,64,76,83,87,96,117,148,177,200,219,236,244,248,248,240,215,173,124,83,55,32,15,6,1,0,0,0,0,0,0,0,0,0,9,31,61,87,105,
+118,130,139,142,143,143,143,143,143,143,143,144,147,151,155,157,158,159,160,159,157,154,147,133,109,80,52,28,11,2,0,0,0,0,0,0,0,0,3,13,31,53,71,86,108,133,150,156,
+154,142,120,99,83,70,54,39,26,14,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,13,29,58,96,117,107,71,22,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,24,49,98,144,176,187,194,201,207,211,216,220,222,222,222,222,222,222,222,223,221,216,207,195,185,
+175,168,167,166,165,162,156,144,120,93,73,71,88,108,117,124,252,255,255,254,250,244,233,219,217,210,181,146,118,90,64,47,38,32,26,20,16,12,10,12,16,17,18,16,13,10,9,8,
+8,8,8,8,7,6,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,7,8,9,12,20,35,55,78,107,143,173,197,219,239,247,242,226,202,177,142,100,
+65,38,19,9,4,1,0,0,0,10,32,67,110,141,153,157,159,160,159,159,159,159,159,159,159,159,159,158,158,157,153,149,146,141,131,118,104,90,71,49,28,11,2,0,0,0,0,0,
+0,0,1,9,27,52,83,119,161,194,211,221,232,241,245,245,245,243,237,229,220,210,195,175,150,121,98,77,47,21,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,7,31,80,136,171,166,102,35,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,23,73,131,169,203,229,229,225,231,236,237,237,
+238,238,238,239,238,238,238,238,238,238,238,239,244,249,250,247,238,230,226,224,221,216,208,193,176,168,178,204,229,244,248,250,199,194,180,148,119,98,75,55,50,46,32,20,21,22,18,11,
+6,3,1,0,0,0,0,0,2,5,9,9,9,7,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,3,7,16,32,51,75,110,158,204,232,245,248,246,235,214,185,151,112,81,61,41,24,22,40,73,113,143,156,158,156,149,142,133,122,115,113,113,112,112,113,113,112,111,108,99,85,73,
+66,57,44,30,21,14,6,1,0,0,0,0,0,0,0,3,16,42,73,111,153,192,218,237,245,242,235,228,216,199,184,180,181,192,208,222,230,236,243,246,244,237,228,214,183,141,105,69,
+34,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,38,94,163,178,135,61,18,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,13,57,122,180,222,229,213,196,174,162,164,169,172,171,166,159,151,141,134,131,131,131,131,131,131,131,132,136,144,158,172,192,206,205,201,200,198,198,198,201,204,210,214,212,206,203,201,
+39,36,27,11,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,3,5,7,11,13,14,13,13,14,15,17,18,20,21,20,15,10,6,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,6,18,45,87,135,175,203,224,240,247,246,237,221,202,185,162,137,130,143,160,164,161,156,140,109,82,
+66,53,41,35,33,32,32,32,32,32,32,32,30,28,31,28,17,11,6,2,0,1,0,0,1,1,1,3,10,26,48,81,130,178,212,233,245,243,233,214,184,149,124,112,98,83,72,70,
+72,80,93,107,119,130,149,170,190,209,224,237,246,243,232,208,166,109,60,32,20,18,19,20,19,15,10,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,63,
+131,175,167,125,62,36,36,36,36,34,33,34,32,31,37,64,114,165,199,205,192,171,139,123,133,146,153,156,153,137,105,78,61,48,36,29,27,27,27,27,27,27,27,26,25,21,19,21,
+32,42,41,40,39,38,39,39,41,44,48,49,45,42,41,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,11,19,
+28,37,47,57,67,77,85,90,91,86,78,67,54,40,30,25,25,25,25,24,21,16,10,7,5,5,5,5,6,6,6,8,14,25,41,53,56,50,40,37,38,39,44,61,85,118,159,193,
+217,235,245,247,248,245,239,233,227,214,199,179,150,117,92,78,73,71,69,69,68,68,68,68,70,72,77,82,88,111,149,158,136,120,109,94,91,88,81,79,79,79,78,85,114,155,188,216,
+239,245,235,218,190,153,120,93,71,57,53,57,61,65,68,70,72,72,71,70,67,65,65,70,78,89,104,129,167,198,221,241,247,232,198,159,127,106,97,94,92,85,76,66,54,40,30,25,
+25,25,25,24,21,16,10,7,5,5,5,5,6,5,3,1,16,62,119,177,197,189,186,184,184,178,171,174,171,167,171,185,187,155,110,82,75,92,120,143,154,157,154,136,103,61,28,11,
+5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,2,2,4,9,18,30,44,61,78,95,110,122,132,139,143,144,141,136,124,114,109,108,108,108,106,102,92,80,70,64,64,64,67,72,75,78,85,
+98,117,133,142,143,139,134,129,127,114,91,70,58,62,80,105,138,176,209,227,239,248,253,255,253,249,238,219,203,194,192,192,192,192,193,193,194,193,193,195,198,203,210,216,221,234,247,249,
+245,241,237,229,227,225,219,217,218,218,217,221,234,245,244,232,204,164,122,91,66,49,44,48,56,67,78,89,98,107,116,120,122,121,118,112,104,95,85,74,63,54,47,45,55,71,98,143,
+196,234,249,247,236,217,198,183,170,160,151,143,135,124,114,108,108,108,108,106,102,92,80,70,64,64,64,67,72,75,78,85,96,111,127,142,162,169,165,163,161,150,132,120,122,122,115,100,
+80,67,73,96,124,147,156,158,153,132,95,56,25,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,6,12,21,31,38,51,68,77,79,79,80,83,88,97,107,118,129,139,148,157,162,165,163,161,159,159,158,157,156,
+157,157,157,157,156,155,151,147,144,144,144,146,149,151,152,155,157,159,159,159,159,160,160,160,159,158,154,144,134,128,128,131,141,156,174,186,198,213,225,229,232,238,244,245,245,245,244,245,
+245,245,245,246,246,246,247,248,249,251,252,253,253,252,251,251,251,248,245,237,236,235,229,227,228,228,228,229,222,189,147,111,72,43,29,28,34,44,57,71,87,101,117,132,146,155,157,156,
+155,156,159,160,154,143,127,112,97,82,67,53,41,33,33,46,82,133,182,218,241,251,251,245,235,222,204,189,178,168,161,157,156,157,157,157,156,154,151,147,144,144,144,146,149,151,152,155,
+157,158,159,158,156,156,156,156,154,153,149,140,130,125,123,124,129,138,148,155,159,158,150,128,90,50,21,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,27,45,52,61,75,92,104,122,147,166,175,191,210,217,218,218,218,218,220,
+222,223,224,225,226,227,227,226,225,218,206,198,193,185,174,163,154,147,144,144,147,152,156,157,159,159,159,159,158,158,157,155,152,148,139,126,118,114,117,131,145,151,156,158,160,159,159,159,
+159,159,158,156,150,136,120,111,117,142,174,196,209,218,227,236,243,246,248,248,248,249,250,250,248,243,235,228,225,222,223,215,182,149,130,113,109,107,99,97,96,97,96,97,86,55,28,17,
+14,18,25,36,49,63,80,99,117,137,154,157,133,98,70,53,47,51,65,92,129,159,164,150,131,112,93,76,60,48,41,37,40,51,68,94,130,170,201,226,242,249,248,241,230,215,195,175,
+160,152,148,147,148,151,154,156,158,158,159,158,158,158,157,155,152,148,139,126,118,114,117,131,145,151,156,158,159,159,159,159,160,159,158,153,144,121,85,46,18,3,0,0,0,0,0,0,
+0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,9,21,36,95,176,203,208,
+209,215,226,232,239,244,245,245,242,235,229,228,228,229,229,229,229,229,228,228,228,227,228,229,233,239,243,243,242,236,223,205,181,148,122,109,101,98,101,109,117,122,123,124,124,120,106,88,
+75,66,50,34,25,23,26,44,64,81,98,116,128,132,132,131,127,119,106,86,63,40,26,28,51,89,125,156,189,215,234,244,244,240,233,229,228,225,212,188,162,139,118,104,99,95,92,79,
+48,21,11,7,6,6,5,5,5,5,5,7,6,5,6,10,17,25,35,48,62,80,101,122,144,159,140,76,20,0,0,0,0,0,0,0,13,60,133,168,159,138,117,96,77,63,52,41,
+31,24,18,13,19,33,56,90,127,165,202,228,242,247,240,221,198,176,160,144,128,121,119,118,120,121,121,122,123,119,105,87,75,65,49,33,25,22,26,43,64,81,98,116,128,132,132,132,
+128,121,108,89,64,38,15,2,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,3,3,2,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
+26,26,26,26,31,47,77,98,112,143,174,195,230,253,253,248,243,231,221,213,201,180,162,151,134,111,99,97,98,98,98,98,97,96,97,96,96,97,98,100,110,131,159,181,201,219,234,242,
+242,227,208,192,170,134,98,73,54,42,38,36,36,32,21,10,3,0,0,0,0,0,0,0,3,8,16,29,39,43,44,44,42,38,37,43,57,82,104,129,167,201,217,227,239,242,229,202,
+165,133,111,102,99,92,73,47,28,18,12,9,8,8,8,5,1,0,0,0,0,0,0,0,0,0,0,1,3,5,9,15,21,29,41,55,72,93,115,140,160,144,63,0,0,0,0,0,
+0,0,0,0,0,0,42,136,172,157,134,111,91,71,54,40,27,19,13,7,3,1,1,3,12,31,60,97,136,176,215,237,244,241,235,225,207,190,169,139,109,83,68,60,51,39,26,15,
+9,6,3,0,0,0,0,0,2,8,17,29,39,43,44,43,40,33,24,14,5,0,0,0,0,0,0,0,0,1,3,4,4,5,4,5,5,5,6,7,7,8,8,8,8,8,7,7,
+6,4,5,11,6,0,0,0,3,17,25,26,26,26,26,26,183,182,183,183,189,206,224,232,232,226,211,192,165,162,163,142,127,103,84,72,58,41,29,22,16,10,6,6,6,6,4,4,
+5,5,5,5,5,4,5,5,8,16,28,41,59,84,116,151,189,219,235,241,245,238,216,188,148,111,89,80,78,77,71,57,40,29,24,24,24,24,24,26,28,29,31,31,31,33,42,59,
+77,92,122,161,193,221,233,240,246,242,230,217,193,153,107,63,31,14,7,5,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,7,11,15,
+21,31,43,58,77,98,122,147,163,122,24,0,0,0,0,0,0,0,0,0,0,0,9,103,171,166,142,118,95,73,54,40,28,20,14,9,6,4,2,0,0,0,0,5,18,41,82,126,
+162,187,203,220,235,243,244,236,218,192,174,158,135,112,99,94,89,87,87,82,66,49,39,32,27,24,22,23,24,26,26,27,29,32,35,38,41,43,44,46,45,42,37,36,43,58,72,81,
+83,83,83,83,84,84,84,85,85,85,86,86,86,85,86,85,81,72,83,105,74,57,85,98,121,165,183,183,183,183,183,182,201,200,201,200,195,177,141,120,106,79,50,33,20,25,29,19,
+12,6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,10,24,51,85,112,135,168,207,231,244,244,235,224,218,217,217,214,200,
+181,164,155,154,154,153,154,158,161,167,179,176,170,170,181,200,216,225,237,245,244,234,220,206,183,154,129,109,82,53,28,13,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,1,3,4,7,10,15,21,31,42,57,75,96,120,145,163,139,47,0,0,0,0,0,0,0,0,0,0,0,28,126,174,164,139,115,91,70,53,39,
+28,19,14,9,6,4,2,1,0,0,0,0,0,0,3,15,30,46,62,85,116,143,174,206,230,242,245,245,242,236,231,228,225,223,223,220,206,190,178,168,162,157,154,154,154,155,156,161,
+165,168,172,174,175,175,176,176,177,176,174,174,185,202,213,219,220,219,218,219,220,219,219,219,220,220,220,220,220,220,220,220,217,218,227,235,215,210,227,231,233,218,202,200,200,200,201,200,
+40,39,40,39,35,24,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,4,9,17,35,67,104,148,187,210,223,227,227,228,230,237,243,244,243,244,244,243,243,243,243,247,254,255,254,254,254,253,247,239,225,200,171,141,116,87,54,35,34,39,44,47,49,48,
+44,39,35,33,33,32,30,17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,6,9,13,19,27,38,52,68,87,108,131,155,164,126,49,4,0,0,0,
+0,0,0,0,0,34,113,169,170,149,126,103,82,63,48,35,25,18,12,8,5,4,2,1,0,0,0,0,0,0,0,0,0,0,0,3,10,20,38,66,102,132,150,168,190,204,213,218,
+221,222,223,226,234,241,243,243,243,244,244,244,245,247,248,249,249,248,247,247,246,246,246,247,247,248,248,249,250,247,241,237,237,236,235,235,235,235,235,234,230,230,231,231,230,231,231,230,
+228,231,227,214,206,180,138,120,107,66,41,39,39,39,40,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,23,46,68,86,97,101,107,118,139,162,180,187,189,189,190,190,188,183,186,199,204,209,218,228,236,
+240,236,224,210,199,193,187,160,110,66,36,17,10,12,22,30,38,44,48,49,49,49,46,25,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,7,11,
+16,22,31,42,56,72,91,110,131,152,166,154,112,68,40,25,20,23,35,60,103,151,175,167,147,126,106,86,68,53,39,28,21,15,10,7,5,3,2,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,6,13,22,35,56,75,89,100,107,111,116,124,141,160,173,180,185,189,190,190,190,189,184,180,177,175,175,177,180,187,190,185,178,178,179,178,168,148,133,128,
+131,136,138,139,140,140,138,128,116,116,116,116,116,116,114,113,109,97,81,65,55,35,15,8,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,3,4,5,10,19,29,38,45,50,53,58,
+65,73,81,86,90,99,109,114,110,104,100,90,81,81,95,118,150,180,198,207,213,218,218,223,228,219,192,152,97,49,22,7,1,4,9,11,12,13,12,5,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,3,4,6,8,12,17,22,31,42,54,69,85,102,119,136,153,166,167,160,152,149,151,161,170,173,165,149,132,115,98,81,65,52,40,29,21,
+15,11,8,6,3,3,1,0,0,0,0,0,0,0,0,0,0,0,1,2,4,5,6,7,11,18,25,33,42,47,50,51,51,53,60,65,73,88,103,113,114,111,105,93,82,74,70,70,
+71,73,79,92,106,113,103,77,59,58,59,60,55,46,41,41,43,48,51,53,54,55,54,49,45,45,46,47,45,44,42,40,37,30,22,17,14,11,10,8,5,3,3,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,19,29,33,37,39,40,41,45,46,46,42,37,29,21,16,11,10,11,13,18,29,45,63,81,92,94,87,74,64,62,67,74,81,92,103,110,107,97,103,128,162,194,222,230,209,173,132,
+84,39,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,6,8,11,16,22,28,37,47,59,72,84,97,110,121,132,141,146,
+149,148,146,138,129,118,106,95,82,68,56,45,35,27,20,15,11,8,5,4,2,1,0,0,0,0,0,0,0,0,0,0,6,24,33,36,41,42,42,44,48,50,49,45,39,30,23,18,
+15,15,17,20,24,34,52,71,88,99,101,95,85,78,77,82,84,84,89,100,108,104,90,73,60,49,42,41,42,44,46,48,48,49,50,50,50,50,50,52,53,54,54,53,53,52,49,46,
+42,38,34,28,23,19,15,12,9,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,0,0,0,0,0,0,2,4,15,39,70,88,104,122,128,127,125,121,117,110,105,101,97,95,93,86,79,68,50,40,43,52,65,75,76,75,73,64,53,46,43,
+39,32,29,29,30,29,33,43,53,62,71,96,143,183,215,236,232,200,149,102,63,36,18,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,
+5,7,10,14,18,23,30,37,45,54,62,70,78,85,90,95,96,96,94,90,84,77,69,60,52,44,36,28,21,17,13,10,7,4,3,2,1,0,1,1,1,1,1,0,0,0,0,0,
+10,37,49,50,48,47,46,42,35,25,16,9,4,0,0,0,1,3,5,7,15,26,42,58,73,81,86,88,80,71,69,68,68,66,65,67,69,72,77,87,95,95,86,76,71,73,78,84,
+88,89,90,94,94,89,83,76,71,70,69,67,67,64,62,58,53,47,41,35,28,22,18,14,11,8,5,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,25,26,27,35,54,70,90,113,126,135,159,188,202,211,222,231,233,233,233,232,233,232,232,231,231,232,231,
+231,230,225,213,201,197,195,191,179,150,119,93,63,37,18,8,1,0,0,0,0,3,8,22,45,69,81,78,74,78,95,126,167,210,236,239,214,172,122,79,53,40,32,27,25,25,25,25,
+25,25,25,25,21,14,7,1,0,0,0,0,0,0,1,2,3,3,4,6,8,11,15,19,24,29,34,39,44,48,51,53,56,56,55,53,49,45,40,35,30,25,21,16,13,10,8,5,
+4,3,1,2,14,28,30,31,31,31,31,28,21,12,5,0,0,5,10,23,35,39,40,41,46,64,83,107,127,130,130,130,133,136,138,141,147,153,159,160,158,153,150,150,132,92,57,46,
+45,47,50,54,57,61,69,82,102,122,133,131,125,121,118,117,117,116,120,132,139,139,136,126,118,110,105,102,99,97,94,90,84,76,69,62,53,39,27,18,12,8,6,4,3,2,0,0,
+0,3,8,15,22,24,24,24,24,24,24,23,24,21,14,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,50,72,103,151,198,217,227,232,232,230,223,
+205,187,175,162,148,142,140,139,138,140,141,143,146,147,147,147,151,157,172,193,211,217,220,223,227,236,235,228,208,176,141,103,73,48,33,27,27,33,37,45,55,62,68,69,60,44,27,18,
+25,51,97,159,210,239,234,199,149,106,86,80,80,82,83,83,83,84,84,84,82,75,63,46,26,7,0,0,0,0,0,0,2,6,11,19,27,30,32,34,36,37,40,42,44,44,40,33,
+29,26,26,25,24,23,21,18,16,13,11,9,8,5,4,3,2,1,0,2,23,44,49,49,49,49,49,53,58,63,66,64,59,54,59,84,116,139,155,163,180,193,191,181,168,167,168,167,
+166,167,168,172,176,180,180,178,176,177,178,181,194,208,185,153,125,97,86,87,91,96,101,110,119,126,133,135,131,124,115,109,107,108,113,122,129,135,146,160,171,177,188,198,198,196,195,194,
+186,177,161,140,129,113,90,62,37,15,3,2,1,0,0,0,50,61,73,88,98,98,97,96,96,96,96,97,97,93,83,66,44,22,8,6,3,0,0,0,0,0,0,0,0,0,3,7,
+12,22,42,65,103,149,188,219,234,221,204,197,184,181,180,171,155,145,137,130,122,117,108,87,64,49,38,28,25,26,26,28,33,42,57,77,89,87,80,76,84,108,136,167,200,223,235,235,
+224,200,173,134,85,56,47,44,33,22,15,13,10,5,1,0,0,0,0,13,47,108,175,222,233,200,150,106,78,64,58,56,58,60,60,62,67,76,84,89,83,58,27,7,2,7,21,35,
+53,66,75,89,99,100,100,101,102,103,104,105,104,103,94,79,59,38,24,17,13,9,5,5,4,3,2,2,1,0,0,0,0,0,0,0,5,11,14,14,13,14,15,26,51,86,126,161,
+184,192,194,193,185,164,144,131,107,72,49,36,32,34,36,39,44,52,63,76,82,79,72,67,66,70,77,82,94,128,166,196,212,212,194,182,179,174,161,149,144,140,139,142,144,143,143,146,
+155,170,184,187,186,191,201,214,218,217,214,205,204,203,201,199,199,203,209,212,210,210,203,182,155,115,62,20,4,5,16,28,116,115,115,110,106,117,129,135,139,140,138,132,129,131,137,145,
+140,118,108,130,129,117,108,105,101,100,103,109,110,118,136,149,161,178,203,221,236,245,246,244,233,214,213,221,223,224,225,226,228,231,232,235,234,234,232,223,207,190,170,135,97,68,57,56,
+53,51,49,43,30,15,6,4,4,6,11,22,43,69,104,143,176,205,227,235,202,136,75,45,31,24,23,25,26,27,27,27,27,26,20,12,6,8,27,72,147,207,229,212,174,135,95,62,
+26,6,4,2,4,11,22,41,68,91,92,73,64,82,106,117,119,117,116,115,116,125,143,161,167,168,168,168,168,169,174,177,173,156,140,129,112,81,51,33,20,21,23,14,10,11,13,12,
+12,9,4,1,0,0,0,0,0,0,0,0,3,8,20,37,57,74,82,83,75,57,45,37,30,26,28,31,34,38,42,50,60,69,73,70,60,51,48,49,53,60,66,72,76,80,88,102,
+125,158,184,195,199,207,215,217,217,217,218,220,220,221,222,223,222,216,207,203,200,194,181,164,150,142,136,130,128,125,120,113,106,101,102,109,104,105,127,161,188,207,205,171,136,122,115,113,
+177,162,157,154,163,199,214,211,210,211,207,187,183,184,190,201,209,212,220,242,251,247,243,242,240,239,239,240,240,245,254,255,255,255,253,251,253,247,229,210,198,195,182,150,132,121,118,118,
+119,120,121,126,131,136,147,171,196,210,225,236,235,220,208,199,171,118,74,46,23,11,8,7,5,4,4,3,3,4,7,14,26,47,84,149,212,237,217,188,156,130,115,105,102,101,102,102,
+102,102,97,87,78,67,49,33,34,64,120,176,209,223,224,209,159,112,91,63,40,35,41,58,91,134,175,187,186,191,197,186,146,130,139,157,178,199,219,229,229,230,230,230,230,230,234,239,
+243,244,245,247,244,229,206,180,151,155,170,141,116,96,79,68,67,64,55,46,36,25,17,12,5,1,0,0,0,1,0,0,0,3,8,18,32,43,52,57,60,62,62,63,65,68,70,70,
+69,64,58,59,69,77,81,84,81,80,83,87,91,97,102,107,110,114,122,133,143,156,175,195,203,205,206,205,205,206,206,204,199,194,187,183,177,171,162,153,144,139,136,134,131,127,121,115,
+106,95,82,68,56,45,40,48,76,121,175,206,217,224,221,205,224,237,228,215,208,185,135,101,92,93,91,78,73,68,65,68,74,83,98,122,147,158,163,168,171,174,173,170,170,172,176,170,
+165,162,161,166,183,177,139,111,93,78,58,32,17,10,5,3,3,3,4,5,6,10,16,27,42,56,75,107,148,182,197,208,229,229,212,191,162,135,121,102,75,55,45,41,31,17,13,14,
+20,30,48,76,119,168,207,235,247,239,222,193,155,129,120,113,107,106,109,114,117,118,116,108,92,74,67,75,90,117,156,199,232,236,231,219,205,202,209,220,231,240,250,254,254,253,254,249,
+226,222,229,226,218,205,177,146,135,134,135,134,133,128,126,126,131,137,143,151,170,200,223,238,246,252,255,250,236,210,167,129,103,87,84,85,85,81,77,70,58,44,30,21,14,9,7,6,
+6,7,7,8,11,16,21,27,34,42,55,66,73,75,82,101,121,127,132,161,193,202,204,201,184,166,159,147,135,133,133,134,140,148,158,169,178,184,187,191,199,202,200,199,200,200,201,201,
+200,201,202,203,202,201,200,195,187,179,172,165,157,149,143,136,129,121,109,99,94,94,99,108,119,129,131,122,114,132,166,197,187,161,135,122,118,109,98,94,94,94,94,94,91,83,71,61,
+57,58,57,53,48,44,42,41,44,47,47,46,46,43,33,24,21,24,31,40,54,63,67,74,82,84,82,76,68,58,47,36,27,21,16,14,11,10,9,10,13,18,20,24,32,43,48,60,
+100,147,176,198,219,227,229,229,219,206,197,194,176,144,131,132,135,128,122,113,99,85,80,101,145,178,204,228,223,200,185,164,137,125,129,143,151,147,153,164,171,176,176,172,168,174,193,215,
+236,247,251,255,255,255,255,251,245,233,221,211,207,208,214,223,220,194,171,154,138,128,113,103,100,99,100,100,97,88,77,68,65,66,64,59,57,65,80,101,140,181,215,241,251,251,242,225,
+196,161,138,136,142,144,147,151,155,151,137,117,99,88,79,68,61,56,54,54,53,52,56,74,102,123,156,184,192,194,202,221,232,234,236,237,226,220,221,225,236,240,241,238,229,224,219,212,
+210,210,205,200,193,186,180,178,181,183,183,182,182,183,183,183,182,182,182,183,183,185,189,194,198,200,199,198,193,188,183,179,178,176,170,164,164,165,166,166,154,124,105,101,112,158,193,195,
+61,68,82,93,100,104,106,105,105,105,105,105,107,114,119,119,119,118,117,113,108,97,84,70,57,45,36,32,28,25,23,21,21,22,23,25,29,33,35,36,44,54,64,74,81,87,90,90,
+87,83,78,74,69,65,64,66,73,79,82,82,78,72,68,66,69,74,78,89,110,128,139,158,182,204,214,222,235,244,245,244,242,232,218,207,195,180,159,135,121,123,142,184,220,240,250,251,
+245,242,242,245,247,238,229,231,233,236,238,240,243,241,233,223,222,222,223,220,213,200,189,181,170,149,124,103,86,72,67,76,90,85,86,94,99,102,104,103,104,104,104,104,106,112,117,118,
+118,118,117,114,109,98,84,72,66,70,93,136,178,213,237,249,250,243,232,228,228,229,229,230,232,234,234,229,222,219,218,214,209,207,205,205,203,202,206,221,237,243,246,237,231,230,228,212,
+193,188,187,174,155,150,155,163,179,196,209,225,236,242,246,250,251,250,245,238,229,217,206,195,190,189,189,189,189,187,182,180,179,177,175,173,169,166,164,165,169,172,176,180,184,185,182,181,
+184,185,181,177,174,171,170,179,182,188,202,199,186,153,96,59,49,43,35,31,30,29,29,28,28,28,28,28,32,42,53,63,68,74,88,107,130,150,153,149,144,133,121,112,103,100,100,99,
+99,100,101,105,107,106,100,87,75,66,58,53,53,58,65,79,95,107,112,110,105,101,98,96,93,88,88,89,91,96,105,109,105,101,101,102,102,101,102,105,111,120,121,115,121,139,145,144,
+151,172,188,196,202,211,221,230,230,228,226,227,231,232,220,208,207,207,208,209,207,169,125,120,120,116,112,112,111,100,82,68,71,76,78,78,77,74,72,76,88,103,113,115,111,97,75,58,
+48,42,35,30,30,29,29,28,28,28,28,28,32,42,54,64,70,76,89,109,133,152,155,152,145,133,122,116,119,138,166,203,237,248,236,208,185,182,182,176,170,168,175,190,203,208,212,219,
+226,230,231,231,230,229,227,214,194,182,171,152,148,153,160,158,153,153,157,161,163,166,170,174,177,181,185,186,189,192,196,203,208,215,226,236,243,248,249,245,240,238,237,236,236,231,218,213,
+211,210,208,206,204,192,178,173,171,169,166,167,168,168,164,160,159,158,155,154,164,188,203,212,206,194,165,141,127,105,80,66,115,101,79,58,43,33,28,26,25,24,24,24,24,26,29,35,
+45,63,86,109,132,149,151,146,141,134,126,117,109,107,110,114,121,130,143,155,158,159,158,156,151,146,137,126,117,106,93,90,100,107,111,111,107,99,89,74,57,42,37,36,39,47,57,64,
+60,58,64,70,71,71,70,70,70,68,59,46,39,37,36,34,37,45,53,58,62,69,83,104,122,130,130,129,127,111,81,59,55,54,54,54,50,30,12,9,9,7,6,5,3,1,0,0,
+0,0,0,1,3,3,4,7,15,31,50,67,88,109,119,118,111,100,79,58,43,33,28,26,25,24,24,24,25,27,31,37,48,66,89,112,134,152,155,151,146,139,132,123,114,112,115,129,
+165,212,244,241,210,180,163,158,157,153,150,147,148,143,135,137,145,151,155,157,156,152,145,129,110,99,96,97,103,111,122,130,132,135,144,152,156,160,164,168,171,174,173,171,171,172,174,177,
+180,183,189,194,202,211,222,233,239,240,241,241,242,247,250,249,249,248,248,249,250,241,228,226,224,223,221,219,219,217,215,212,209,207,203,199,190,168,131,91,61,53,56,70,88,107,118,121,
+91,107,119,120,114,108,104,102,101,100,100,101,100,101,100,103,110,117,119,113,103,91,76,62,50,43,41,45,54,69,87,101,114,129,143,150,148,147,149,151,153,154,155,156,153,139,111,86,
+74,71,73,82,92,100,102,99,87,69,54,43,39,41,44,45,45,45,41,38,39,39,40,41,41,40,40,40,40,40,39,39,38,36,35,34,32,30,30,30,31,30,29,28,26,22,18,16,
+14,13,12,11,10,9,10,9,8,6,6,5,5,4,3,3,3,2,2,1,1,1,0,0,0,0,1,5,15,33,58,80,96,110,119,119,114,108,104,102,101,100,101,101,101,102,101,104,
+112,119,122,117,108,97,84,72,62,55,54,59,68,82,98,111,124,151,190,231,250,239,203,169,160,162,166,168,166,156,135,117,111,110,115,123,133,140,144,144,137,128,121,117,118,122,128,133,
+137,140,142,145,149,154,158,161,165,169,172,174,177,180,182,184,187,188,189,190,190,191,193,197,200,201,201,202,202,208,215,218,217,216,214,212,209,197,180,174,171,168,164,160,158,154,149,143,
+136,126,113,98,76,53,34,23,16,12,11,12,19,33,50,64,16,32,54,72,86,97,103,105,105,105,105,104,104,105,105,104,97,80,60,42,29,19,11,7,9,18,40,67,91,109,119,122,
+120,114,103,89,76,71,72,73,76,77,78,79,76,65,47,30,23,21,23,29,39,51,66,85,100,109,104,88,78,78,79,80,82,79,61,46,47,48,49,50,50,51,51,51,52,51,50,50,
+49,48,47,45,44,43,40,38,36,34,33,31,29,28,27,25,23,22,20,18,16,15,14,13,12,11,9,8,7,7,6,5,5,4,4,3,2,2,2,1,0,0,0,0,0,0,1,7,
+19,34,53,72,86,97,103,105,105,105,105,105,105,106,107,107,101,86,67,51,40,33,27,25,27,37,58,84,107,124,134,136,134,128,121,130,166,219,243,208,155,121,109,111,113,108,97,88,
+86,89,94,102,112,121,133,147,159,166,165,157,153,156,160,163,166,168,162,158,162,165,169,172,174,177,180,183,185,186,188,189,190,191,192,192,192,192,193,192,192,191,191,189,188,186,186,184,
+182,178,173,168,163,156,149,143,138,133,128,124,120,115,108,101,92,82,72,61,51,42,33,26,19,14,9,5,2,0,1,4,0,0,4,17,34,49,57,58,58,54,49,47,48,53,58,58,
+51,41,33,34,39,44,51,58,68,87,111,121,116,100,81,66,54,40,27,17,11,9,9,11,11,12,14,14,15,15,14,15,16,18,20,22,24,27,31,40,54,72,81,76,72,73,75,76,
+79,77,66,57,59,60,61,61,62,62,63,63,62,62,62,61,59,58,57,55,54,52,50,48,46,43,40,38,35,33,33,31,29,26,24,22,20,18,17,16,14,13,11,10,8,8,7,6,
+5,4,4,3,2,2,2,2,2,1,0,0,0,0,0,0,0,0,4,17,34,49,57,58,58,55,50,48,50,56,62,63,58,49,44,47,54,61,68,77,88,106,127,138,134,121,106,93,
+83,72,61,52,55,97,178,232,229,190,125,79,75,81,86,92,97,103,107,112,116,120,125,132,143,155,162,161,161,163,167,170,173,175,171,169,172,175,177,181,182,184,186,187,189,190,190,191,
+191,192,193,192,192,191,191,191,190,188,187,185,184,182,180,177,174,169,164,159,154,148,142,135,130,125,120,114,110,105,99,92,85,76,66,56,47,38,29,22,17,13,9,5,3,2,0,0,
+3,16,38,58,72,81,83,83,83,81,76,74,77,90,101,102,101,100,100,106,113,116,118,120,121,117,101,73,45,25,12,6,4,2,2,3,4,5,6,7,7,9,10,12,14,16,18,19,
+22,25,27,30,32,34,35,37,39,44,48,51,53,56,58,61,63,64,66,67,69,70,72,72,73,74,74,74,73,74,72,72,70,68,67,65,63,61,59,58,55,54,56,56,52,48,44,39,
+34,31,29,27,25,22,19,17,15,14,12,11,10,7,7,6,4,3,3,3,2,3,3,2,2,1,1,1,0,0,0,0,3,17,39,58,72,81,83,83,84,82,77,75,80,94,106,108,
+108,108,110,117,126,131,134,138,140,138,125,102,81,64,55,51,50,51,54,55,56,59,88,147,204,239,226,169,127,109,106,109,115,120,125,131,135,138,141,144,147,151,155,158,161,163,166,169,
+171,174,176,178,181,183,184,186,187,188,189,190,190,190,190,190,191,191,191,189,189,188,187,186,184,183,183,182,180,177,173,169,164,159,153,149,143,136,129,122,117,111,105,98,93,88,82,75,
+68,61,52,44,38,31,23,19,14,10,7,4,3,1,0,0,50,74,88,86,76,67,62,61,63,69,74,75,79,93,104,105,105,104,102,97,91,85,78,70,62,47,26,9,1,0,1,1,
+3,4,5,6,6,7,8,10,11,12,14,16,17,19,21,24,27,30,32,34,37,40,43,45,48,51,54,57,61,64,67,70,74,77,81,88,96,101,103,104,105,105,105,105,105,105,104,103,
+102,100,98,97,92,85,75,69,64,69,86,93,90,85,80,74,62,50,41,35,31,29,27,26,24,26,31,34,36,36,35,33,30,25,19,13,7,3,1,1,1,1,0,0,0,0,0,17,
+53,77,88,86,76,67,62,61,64,70,75,77,83,97,110,113,115,116,115,114,112,109,106,101,96,87,75,70,73,76,78,80,87,104,120,126,127,134,155,178,196,224,248,248,230,204,177,153,
+139,139,143,146,150,153,157,159,162,165,167,169,172,174,175,178,180,182,183,185,186,187,188,189,189,189,190,190,190,190,189,189,188,187,186,184,183,181,179,178,176,176,183,185,183,180,175,170,
+163,153,144,136,129,123,117,111,106,102,102,115,121,117,113,108,102,93,78,61,40,25,17,11,6,2,0,0,0,0,0,10,94,80,54,31,16,9,6,6,7,11,14,15,16,23,27,28,
+28,28,26,21,16,12,9,6,3,1,0,0,1,2,3,3,4,5,6,7,8,9,10,11,13,15,17,18,20,23,26,29,32,34,37,41,44,46,49,53,58,66,77,85,90,94,99,111,
+129,139,146,164,184,192,194,194,194,194,194,195,195,194,194,194,193,192,192,190,186,170,144,118,98,87,88,89,88,87,87,89,88,85,78,70,63,61,62,62,61,63,68,80,91,93,92,90,
+88,85,78,69,56,39,24,13,6,3,2,2,5,14,39,79,89,75,53,31,16,9,6,7,8,13,17,19,24,31,39,43,46,50,52,53,54,55,55,58,70,90,121,154,175,182,183,184,
+192,211,226,229,230,233,242,247,247,247,248,252,255,255,249,230,201,186,179,173,171,169,170,172,174,175,177,179,180,182,184,186,186,187,188,189,189,189,190,190,190,189,189,188,187,187,186,184,
+183,181,179,177,175,173,170,167,165,164,169,169,166,165,164,163,160,156,149,139,131,126,123,119,115,111,119,185,220,217,216,215,213,210,205,195,170,143,132,119,103,72,39,19,6,11,34,65,
+49,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,5,5,6,6,6,7,8,9,12,14,16,17,19,21,25,28,31,33,
+36,39,42,46,50,57,69,82,104,137,167,183,187,189,193,207,224,232,235,243,249,249,249,250,250,250,250,250,250,249,250,250,250,249,249,250,249,246,235,217,194,163,129,105,92,83,74,71,
+72,76,79,80,80,78,73,69,66,60,54,61,71,73,72,70,71,75,81,88,92,92,83,71,57,48,44,47,57,73,90,80,45,19,4,0,0,0,0,0,0,1,3,5,7,11,14,18,
+23,28,34,40,48,60,77,105,152,195,226,243,247,248,248,248,249,247,240,238,239,237,230,215,210,210,212,217,229,242,250,254,249,243,236,227,218,207,202,202,199,194,191,189,188,187,188,189,
+190,190,191,190,190,190,190,189,188,187,186,185,184,182,179,177,175,173,171,168,164,162,158,154,151,148,145,141,137,133,130,129,129,130,129,128,124,119,113,107,101,93,89,113,130,128,126,123,
+122,124,132,149,176,189,186,184,185,192,189,177,146,135,127,103,119,73,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,16,26,30,33,34,34,
+35,34,30,23,17,14,13,14,15,17,20,24,27,30,33,37,41,47,54,66,86,120,158,183,207,233,246,249,249,249,250,250,247,242,241,236,225,217,216,216,217,217,217,217,217,217,217,217,
+216,215,214,213,216,228,241,248,250,243,224,201,187,170,144,126,114,95,80,74,64,54,45,39,35,31,25,23,24,21,21,19,18,20,24,31,43,59,74,85,88,90,90,89,87,81,62,30,
+3,0,0,0,0,0,1,2,2,3,5,7,11,15,18,22,29,39,49,66,98,142,179,211,239,250,245,232,217,213,213,214,212,199,180,171,169,166,156,145,142,145,151,157,171,189,210,227,
+239,247,252,253,252,248,245,245,241,233,228,221,211,201,195,193,191,191,190,189,188,188,187,186,184,183,180,178,176,174,171,168,165,162,159,155,151,146,142,138,135,132,128,124,123,124,121,117,
+114,111,108,107,105,101,91,78,66,56,49,44,42,40,37,34,32,31,31,36,48,65,77,86,94,107,128,155,184,190,194,180,145,174,178,129,91,53,14,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,1,1,11,38,52,53,52,53,53,53,55,58,58,55,49,42,35,31,38,47,51,53,57,61,72,91,110,128,157,191,224,243,248,249,242,224,210,208,209,211,207,
+194,183,182,177,167,163,163,165,166,167,167,167,167,166,166,164,162,160,158,155,155,164,178,195,215,234,247,250,249,247,238,230,223,202,182,168,139,105,78,62,56,54,51,44,33,23,17,15,
+11,9,7,5,6,9,16,26,35,43,45,42,34,20,7,0,0,0,0,0,0,0,1,1,2,3,5,8,11,17,30,54,82,105,128,163,204,237,249,249,237,211,187,170,157,153,154,155,
+155,151,147,146,145,143,139,136,135,138,141,147,153,161,171,184,197,208,221,231,240,247,248,249,251,253,253,251,245,234,225,216,208,202,197,194,191,186,182,180,178,176,172,169,166,163,160,156,
+151,147,144,140,138,139,139,145,151,151,148,152,164,174,178,179,181,184,184,185,183,179,168,149,126,103,82,63,44,30,22,20,18,16,13,11,9,11,17,25,33,38,39,37,35,30,43,89,
+5,28,88,144,171,180,152,113,87,63,41,33,28,26,26,26,26,26,26,26,26,31,51,73,80,83,93,98,95,94,95,97,102,106,104,108,116,121,123,124,132,154,169,171,169,171,173,185,
+208,223,232,243,249,245,231,215,207,187,161,151,152,156,157,156,153,152,154,157,159,162,164,166,167,168,169,169,168,167,166,165,162,159,156,153,149,146,144,145,153,170,190,205,211,224,236,239,
+244,249,249,249,239,220,195,176,170,169,167,159,135,105,90,73,54,41,36,29,19,9,4,2,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,10,19,38,71,120,168,
+205,223,233,245,250,238,214,192,164,136,127,127,126,126,127,128,129,131,135,140,146,151,156,159,159,159,159,160,161,165,169,174,179,183,189,197,206,215,220,222,228,235,240,245,251,253,252,248,
+244,236,230,228,222,210,196,185,178,175,171,168,165,161,157,153,152,158,165,172,181,190,200,213,219,218,218,226,235,240,244,245,246,247,246,247,246,245,243,238,229,215,195,169,131,90,58,37,
+21,13,9,6,4,2,0,0,0,0,0,0,0,0,0,0,15,9,17,35,70,127,183,207,215,215,206,195,179,173,174,174,173,173,173,173,174,179,197,216,221,221,221,221,221,221,221,224,
+231,232,221,218,220,222,224,227,235,246,250,250,248,248,248,249,248,244,241,234,222,206,187,177,174,170,168,170,172,174,174,174,173,172,172,173,176,179,180,182,184,184,185,185,184,184,184,182,
+179,177,174,170,166,161,156,149,145,141,141,142,141,148,158,161,171,189,200,214,231,242,247,247,246,246,246,245,239,227,219,206,183,166,159,148,119,87,61,40,30,28,27,27,27,26,26,26,
+25,24,24,25,24,25,30,48,71,82,94,121,157,197,233,247,244,236,231,218,193,160,132,120,115,114,118,121,123,124,126,126,127,129,129,131,134,138,144,152,160,167,172,175,177,178,182,186,
+191,196,200,204,209,213,216,217,218,221,223,228,236,243,248,251,252,252,252,252,251,247,238,226,219,216,215,212,211,207,202,204,214,226,235,240,244,246,247,246,244,243,243,238,227,211,201,196,
+192,187,184,182,180,179,185,203,221,233,237,233,223,212,191,162,129,102,83,63,45,35,30,27,26,25,25,25,25,25,26,24,109,114,129,143,161,187,209,224,234,245,251,253,251,250,251,250,
+250,250,250,250,250,250,246,237,232,232,232,231,231,230,230,229,227,227,227,227,228,228,229,228,226,211,194,192,198,205,212,217,214,208,203,193,181,173,169,168,170,173,177,179,182,185,189,193,
+196,196,195,194,193,191,190,189,189,188,187,188,188,188,189,188,187,187,185,182,180,175,171,165,159,152,145,138,132,126,120,115,114,117,120,128,144,164,184,194,192,188,187,193,213,228,234,239,
+244,246,245,244,235,220,198,171,158,156,156,155,156,155,155,155,155,154,154,154,154,154,162,186,210,219,224,236,244,244,227,194,161,141,136,127,116,109,111,117,123,127,130,132,133,135,136,134,
+132,132,132,132,134,135,136,140,145,151,160,170,179,187,197,206,215,220,221,221,219,218,216,216,214,214,213,212,214,217,221,227,232,236,238,237,238,245,249,250,250,250,250,249,249,248,247,248,
+248,243,237,230,219,207,194,176,160,152,148,137,117,93,77,73,71,71,69,68,67,65,66,80,101,125,152,177,187,196,220,238,240,232,220,203,186,173,163,157,155,156,156,155,153,150,141,125,
+227,232,238,243,245,245,240,233,226,220,204,183,175,178,181,185,190,196,199,200,203,202,188,166,156,154,155,154,153,156,158,151,139,132,126,121,118,119,119,120,117,104,96,106,126,147,165,176,
+176,168,155,143,135,135,137,141,146,152,159,164,170,176,182,187,193,195,196,194,190,183,175,168,161,155,151,151,152,156,160,165,171,176,182,184,185,185,182,178,173,167,161,155,151,146,140,134,
+131,127,122,119,116,116,119,119,114,107,100,94,98,111,120,136,160,175,179,190,217,234,243,246,245,245,245,245,245,245,244,244,245,245,244,245,245,244,246,245,237,230,225,212,191,167,133,106,
+100,108,120,131,141,149,155,160,164,166,168,169,169,172,173,167,158,152,147,143,141,141,142,143,146,152,160,170,183,195,207,215,217,215,208,202,196,193,190,188,187,186,185,183,182,181,182,185,
+190,199,205,208,211,214,220,224,223,219,216,213,212,212,212,211,205,190,170,151,135,116,97,82,67,58,55,55,56,57,54,54,58,61,61,61,60,58,56,56,54,54,60,74,90,89,104,144,
+185,205,210,215,227,239,244,246,246,246,245,245,245,244,239,231,225,220,198,181,176,170,155,125,102,92,92,97,105,114,122,129,135,137,137,136,133,131,126,120,118,118,119,119,124,137,147,148,
+144,138,129,119,113,112,111,112,115,121,131,140,147,150,148,138,124,114,109,109,114,121,129,138,145,153,160,168,173,178,179,178,174,166,155,142,129,117,106,96,89,84,79,77,77,81,88,97,
+109,124,139,154,167,178,184,187,186,185,182,179,175,168,161,154,145,135,125,118,111,104,98,93,91,90,86,71,47,37,36,38,45,49,50,61,87,114,145,168,174,174,174,173,173,173,172,172,
+173,172,172,172,172,172,170,154,122,105,116,125,123,121,122,131,142,151,158,163,167,172,176,179,182,184,185,187,189,196,201,201,198,195,189,183,179,178,177,178,180,185,191,196,200,202,201,195,
+188,181,176,173,172,172,171,170,169,167,165,164,162,159,155,153,152,154,158,164,173,182,188,194,196,191,186,180,172,168,167,164,160,155,147,139,132,123,113,107,102,97,99,102,98,89,80,73,
+64,55,47,44,41,40,40,40,43,47,47,35,17,17,19,27,49,74,87,89,98,119,144,160,170,174,175,175,177,184,196,212,83,85,64,42,37,36,31,17,6,14,64,108,115,110,104,95,
+83,71,62,55,48,47,47,47,47,48,49,51,58,71,85,101,119,135,143,147,151,160,167,170,172,174,176,167,146,126,108,95,91,94,103,113,121,130,139,147,155,163,169,174,176,174,164,147,
+125,100,75,54,38,30,26,28,30,27,26,23,21,20,22,26,32,43,57,76,100,126,149,167,180,187,192,192,189,183,177,170,158,146,132,120,110,102,93,87,83,81,77,69,56,48,42,37,
+31,26,21,18,18,21,30,39,41,40,38,38,38,38,38,37,37,37,36,36,35,35,34,27,15,21,72,116,126,124,123,122,118,115,117,120,122,127,134,138,143,145,147,150,153,160,166,174,
+183,190,195,196,198,202,205,207,208,209,210,205,192,180,169,161,156,156,158,159,160,160,160,159,157,155,153,150,147,145,141,136,132,127,123,122,126,138,156,180,194,193,187,174,156,146,142,138,
+135,132,131,129,130,132,133,132,134,141,151,153,144,129,116,99,78,58,43,32,26,22,21,20,22,27,30,26,15,11,12,10,7,8,11,12,10,11,17,24,30,33,35,36,36,37,44,56,
+1,3,1,0,0,0,0,0,0,4,38,60,51,39,29,21,12,6,1,0,0,0,0,1,2,3,5,6,8,12,17,25,38,51,62,72,83,99,118,137,151,161,167,165,153,139,125,114,
+109,108,113,120,129,137,147,155,163,170,173,171,162,143,117,85,55,30,15,7,4,6,8,10,12,10,7,4,3,2,2,1,1,2,5,11,24,45,74,105,136,160,178,190,192,191,191,190,
+185,179,172,163,155,148,141,135,131,126,122,119,115,112,109,100,88,81,73,63,58,56,54,50,42,31,18,8,2,0,0,1,0,0,0,0,0,0,0,0,0,10,45,69,65,58,57,57,
+58,62,70,78,86,93,101,107,112,115,118,119,120,121,123,127,131,138,143,146,152,160,170,181,190,195,198,197,189,179,169,159,151,148,146,144,144,144,143,142,140,138,136,133,129,126,122,119,
+118,117,118,122,129,143,160,172,169,152,127,104,88,78,73,69,65,61,58,55,55,58,62,63,71,89,111,133,153,161,160,154,141,127,115,104,95,89,85,83,83,83,83,83,83,84,84,76,
+67,61,55,48,45,45,43,41,34,24,13,3,0,0,0,0,0,0,0,0,0,0,0,5,9,14,21,28,28,26,24,24,23,23,23,22,20,14,10,7,5,3,2,3,5,6,8,9,
+11,13,16,21,26,35,45,59,77,93,110,129,147,162,170,171,165,157,150,147,148,152,159,166,171,173,167,153,127,93,58,29,13,6,4,5,6,6,6,4,3,2,0,0,0,0,0,0,
+0,0,0,0,0,3,16,41,76,114,148,176,197,198,189,181,177,176,176,177,175,171,166,161,158,154,150,146,144,142,139,129,117,111,105,100,104,104,100,100,95,82,69,53,34,19,7,2,
+1,2,1,0,0,0,1,7,12,18,28,39,42,45,50,56,64,72,80,88,94,96,99,103,104,105,107,108,109,109,108,107,105,106,105,104,105,108,113,121,131,140,151,163,175,184,189,188,
+181,172,160,150,142,138,135,133,131,127,126,123,120,119,121,128,135,143,151,157,160,160,148,126,101,77,60,50,44,40,35,32,28,24,21,18,14,15,21,34,53,75,94,110,122,126,121,114,
+108,109,116,124,126,123,119,117,117,117,116,116,117,118,118,109,98,93,90,87,93,94,93,93,89,77,64,48,30,15,5,0,0,0,0,0,3,24,51,68,78,84,89,94,98,100,100,100,
+100,101,102,101,96,88,79,70,57,45,35,26,22,21,21,24,26,27,30,32,36,41,46,54,67,81,96,113,134,157,181,194,197,198,196,192,187,186,188,189,186,177,159,129,88,49,22,8,
+5,4,3,3,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,10,30,64,103,141,182,214,210,184,161,150,146,143,139,133,125,118,111,105,99,94,88,84,78,70,
+62,57,54,54,58,58,54,56,57,56,60,63,58,51,31,6,0,1,0,0,1,23,51,69,80,86,92,100,107,111,115,120,125,130,135,139,140,139,137,134,128,122,117,111,107,105,104,103,
+102,101,100,99,99,99,100,104,110,119,128,139,153,171,189,199,200,199,195,187,177,171,168,163,157,153,150,149,149,150,155,160,161,158,151,140,125,104,80,60,47,40,37,35,31,28,25,22,
+18,15,14,18,27,42,63,81,90,87,77,64,49,37,27,20,17,20,29,39,45,45,43,42,42,43,43,43,44,44,44,38,33,32,33,36,44,46,43,47,49,49,56,60,55,48,29,5,
+0,0,0,0,11,67,116,124,119,116,114,110,107,105,105,105,105,105,106,107,111,117,120,122,121,117,110,100,93,90,90,92,93,95,97,99,103,107,111,119,129,138,146,152,159,167,174,181,
+185,190,193,197,198,199,199,196,187,169,137,95,52,20,6,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,7,24,58,100,145,202,237,231,
+201,167,147,133,122,112,102,93,85,77,70,63,55,48,42,36,30,26,22,19,17,15,12,10,9,9,13,20,26,34,28,9,3,4,2,1,11,66,115,123,119,117,115,114,113,114,117,120,
+124,129,134,138,145,152,157,161,162,160,156,150,144,141,140,140,138,138,138,137,136,137,139,143,148,153,157,160,163,168,173,177,179,179,179,179,178,177,176,172,165,160,156,155,153,149,141,129,
+113,98,83,69,58,48,43,40,37,33,28,24,20,17,15,14,18,28,43,61,80,92,92,76,52,31,16,8,3,2,8,18,25,27,28,31,35,37,35,29,22,16,13,10,8,5,3,3,
+3,1,0,0,0,0,0,0,0,2,6,12,19,28,23,4,0,0,0,0,6,47,78,67,51,44,40,34,29,28,28,28,28,28,28,30,36,45,54,65,79,92,103,113,119,122,123,124,
+125,126,128,130,132,134,135,135,134,132,130,131,131,131,131,132,137,144,153,160,168,175,179,177,165,139,99,55,20,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+1,1,1,1,1,0,1,0,0,7,30,69,118,176,230,251,246,228,208,188,169,158,150,144,139,133,126,122,118,111,98,83,68,57,49,44,41,39,37,35,33,34,50,74,82,83,82,82,
+80,80,80,79,84,116,138,130,120,116,113,110,109,109,112,116,119,123,127,132,138,146,153,160,168,175,181,185,187,187,186,187,186,185,185,185,184,184,184,182,180,177,174,172,169,164,160,163,
+170,175,176,174,171,167,164,162,160,161,161,160,156,149,138,131,128,125,124,127,131,136,146,156,162,158,149,140,133,129,130,137,149,161,170,173,174,172,162,143,128,124,127,134,139,141,150,164,
+171,174,175,173,174,177,176,171,163,152,144,136,124,111,99,90,75,52,33,25,20,12,6,0,0,0,0,0,0,0,0,0,26,13,8,7,5,9,13,8,2,0,0,0,0,0,0,0,
+0,0,0,0,0,0,3,6,11,19,28,39,49,54,57,58,60,61,64,67,69,72,73,73,72,72,74,78,83,89,95,103,113,122,132,142,152,161,165,163,147,115,72,31,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,2,17,50,99,155,212,246,252,251,250,246,239,235,233,232,231,230,229,228,227,224,216,204,
+189,175,166,163,161,161,160,159,158,161,184,213,219,218,218,218,218,217,218,218,217,218,218,216,216,216,216,216,217,217,218,219,219,220,221,222,222,223,224,224,226,228,230,232,233,234,234,234,
+234,233,233,233,233,233,232,231,229,228,227,226,226,223,221,223,229,234,237,239,239,235,232,231,231,231,231,231,231,228,226,227,229,229,229,227,225,223,222,220,215,201,182,170,169,175,181,184,
+180,171,160,147,127,105,101,116,135,145,163,192,218,231,237,241,244,246,247,247,247,245,242,240,238,238,240,241,240,233,224,210,191,173,155,134,109,84,65,62,74,91,105,110,105,91,67,43,
+154,138,129,123,117,105,95,85,69,48,31,25,22,16,8,2,1,1,0,0,0,7,13,11,8,5,4,4,7,9,12,14,16,18,22,25,28,32,35,41,47,57,68,78,87,95,104,112,
+121,130,140,150,157,165,169,165,146,112,67,27,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,13,43,86,136,199,241,
+249,249,247,243,239,240,240,239,238,238,236,236,235,235,239,244,246,247,246,246,246,246,246,245,245,246,247,240,231,229,229,229,228,228,229,228,228,228,228,227,228,228,228,229,229,229,230,230,
+230,231,231,231,231,233,234,233,233,232,232,231,231,232,232,232,232,231,231,230,230,230,230,229,229,230,231,232,233,234,236,238,237,238,238,234,227,218,206,190,174,160,151,146,145,151,156,153,
+145,136,129,122,117,115,113,111,106,100,94,94,92,86,74,58,38,20,10,4,0,0,0,0,1,4,12,32,58,80,97,110,120,130,134,132,153,184,202,208,206,197,193,197,209,225,235,238,
+239,238,237,232,221,207,197,199,211,225,234,235,234,226,207,180,245,242,238,236,235,233,226,213,196,177,162,153,142,126,104,89,83,74,55,32,22,36,49,49,46,38,30,22,16,13,13,15,
+17,19,22,28,36,44,51,62,78,95,111,122,129,135,141,147,154,161,167,173,178,182,183,178,160,126,80,37,11,3,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,1,14,45,89,131,187,233,243,240,227,198,175,168,163,157,153,148,142,138,134,132,139,151,163,175,180,180,179,179,177,176,177,176,167,135,106,99,99,100,
+98,98,98,97,96,97,97,96,98,99,98,100,101,101,102,106,107,108,111,111,116,134,144,145,143,141,135,130,125,121,119,118,117,116,117,117,118,122,125,129,137,146,153,157,159,160,164,166,
+166,162,157,146,131,121,111,102,97,93,91,89,88,89,89,88,86,83,81,81,82,85,88,88,86,82,73,62,45,27,14,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+2,4,5,4,14,40,69,86,95,91,83,78,80,92,108,120,134,144,154,166,182,202,219,233,239,233,228,228,230,236,244,248,194,201,200,197,197,206,222,232,238,242,244,242,239,236,230,226,
+221,210,187,158,130,114,108,108,107,93,71,57,51,46,43,43,45,48,56,70,87,99,106,111,119,124,126,126,130,136,142,148,155,161,167,173,178,183,184,181,167,138,94,49,17,4,1,1,
+1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,22,59,102,145,197,226,219,201,177,149,129,119,110,101,92,84,76,68,61,56,53,53,
+54,57,58,55,51,50,49,46,45,43,37,23,12,9,9,8,7,7,6,5,4,5,5,5,6,6,6,8,9,10,12,14,17,19,21,23,27,45,58,61,66,72,74,74,71,65,60,57,
+56,55,60,70,83,92,95,97,102,102,98,94,92,92,92,92,92,90,87,86,85,85,85,85,86,86,85,84,83,83,82,81,80,80,78,77,74,67,58,50,42,32,21,14,7,3,2,1,
+2,2,4,7,9,9,10,10,10,9,9,8,6,3,1,0,0,0,0,0,0,0,1,4,6,7,6,5,5,5,6,7,12,20,28,31,35,48,71,101,131,141,134,128,127,134,152,176,
+53,73,85,87,81,80,92,111,130,147,163,179,191,200,206,214,225,236,242,243,237,226,218,217,214,195,154,116,93,75,64,60,60,63,75,93,104,107,104,98,92,85,81,81,86,95,103,111,
+120,129,138,148,156,164,170,172,165,144,108,64,27,6,0,0,0,0,0,0,0,0,0,1,1,2,2,3,3,3,3,3,3,3,3,4,4,4,3,3,4,17,46,89,134,182,214,207,
+184,164,148,135,123,113,104,95,87,78,70,62,55,49,43,38,32,29,24,21,17,15,13,11,9,7,5,4,4,3,2,2,1,0,0,0,0,0,0,0,0,0,0,0,1,3,3,5,
+7,10,11,13,14,16,18,20,23,29,36,46,54,58,61,62,61,62,70,85,92,93,87,75,62,49,37,30,27,26,26,26,27,28,28,27,27,26,25,25,25,24,23,22,22,21,20,19,
+18,18,18,17,17,17,22,33,42,47,53,57,59,59,60,60,60,61,66,75,81,83,83,83,83,83,83,80,75,67,59,51,38,24,12,3,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,3,11,23,29,28,25,24,25,35,0,3,6,7,7,9,11,16,22,27,31,36,46,60,71,79,94,121,150,178,202,218,223,224,228,238,237,219,195,164,129,100,
+78,56,44,44,49,50,49,48,50,52,58,65,76,89,99,107,116,125,134,143,152,161,167,171,170,159,136,99,57,23,5,0,0,0,0,0,1,2,3,5,6,8,9,10,12,12,12,13,
+12,12,12,11,11,11,10,11,22,49,89,132,174,205,206,195,188,181,171,156,139,120,104,93,84,76,69,62,55,48,43,38,33,30,26,22,18,16,15,12,10,8,6,6,6,4,4,3,
+2,1,0,0,0,3,7,10,9,6,4,2,1,0,1,3,6,7,9,10,11,12,12,13,13,13,13,15,17,20,25,25,24,24,28,33,33,29,24,17,11,6,5,6,11,16,19,19,
+20,20,20,19,19,18,14,9,5,3,3,3,3,2,4,7,10,12,17,25,40,62,91,116,129,134,136,139,140,140,140,140,140,140,143,145,146,146,146,146,146,146,146,146,145,142,140,136,
+126,109,87,63,38,16,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14,28,44,60,71,77,75,66,56,44,32,21,15,12,
+19,42,79,115,143,164,173,175,183,209,234,245,248,245,235,221,203,171,122,67,35,29,31,37,44,55,72,91,111,126,135,142,147,153,159,166,171,176,180,182,182,179,167,144,109,69,36,15,
+5,3,3,4,6,7,9,11,12,13,13,13,14,14,15,15,15,15,14,12,10,10,14,28,55,92,130,165,190,195,189,188,189,192,192,188,177,158,134,113,94,79,67,58,52,46,40,36,
+32,28,24,20,17,15,12,11,9,7,6,5,4,2,1,0,2,6,16,31,46,61,73,80,79,71,60,50,38,26,15,6,2,3,5,7,8,8,9,9,9,10,10,9,8,13,25,22,
+11,5,3,3,2,3,2,2,3,9,21,39,57,71,76,76,76,75,75,75,76,74,69,58,48,43,43,43,42,45,57,72,81,87,91,101,119,138,154,159,151,133,119,113,112,112,112,112,
+111,110,107,99,91,89,89,89,89,89,89,92,98,105,112,122,134,145,148,143,124,92,61,36,18,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+45,64,87,104,113,115,114,113,116,120,125,123,122,126,129,134,149,170,198,216,222,224,225,227,227,231,235,239,243,247,253,255,255,254,242,201,135,92,65,55,65,86,108,127,134,134,135,140,
+146,151,157,163,169,174,181,187,190,191,189,179,161,132,98,64,36,18,9,6,6,8,9,11,10,6,5,5,5,5,5,5,4,4,3,3,7,18,40,70,106,137,162,178,181,176,170,166,
+164,164,168,175,183,186,180,165,145,123,101,81,64,50,42,36,32,29,25,21,20,18,18,18,16,13,10,9,8,10,21,31,44,63,89,106,116,120,119,118,118,120,120,118,112,102,86,64,
+39,18,6,3,3,4,5,5,5,5,5,5,5,15,42,51,42,28,19,15,13,13,13,18,29,48,69,86,89,83,77,76,75,75,76,75,75,77,81,85,87,87,87,87,86,90,102,114,
+119,115,104,97,96,95,94,92,71,44,30,25,24,24,24,23,23,22,20,15,11,10,10,11,10,11,11,12,15,20,24,33,48,68,92,116,138,146,139,122,97,71,50,30,15,6,2,1,
+1,1,1,1,2,2,5,7,7,4,4,3,3,4,9,19,113,117,115,107,102,103,115,138,164,186,203,208,216,235,245,247,245,233,208,173,145,127,118,117,117,118,118,120,124,133,148,166,
+190,221,248,255,241,216,176,136,114,101,96,96,91,87,91,97,105,113,121,130,138,147,156,166,176,182,186,186,182,172,154,129,99,68,43,25,12,6,2,2,0,0,0,0,0,0,0,1,
+3,8,16,29,51,76,107,135,157,172,180,179,174,167,160,151,143,136,131,131,138,151,163,173,176,173,163,145,124,104,92,86,82,80,78,76,75,77,85,91,87,78,70,67,66,78,97,106,
+111,120,117,104,86,69,57,49,50,58,68,80,93,107,117,121,111,87,59,37,20,10,3,0,0,0,0,0,0,2,15,31,44,50,49,47,47,48,49,52,59,61,57,52,38,24,18,16,
+17,18,17,16,17,17,23,32,41,44,45,45,44,45,49,51,49,42,31,23,18,15,13,13,8,1,0,1,3,5,6,5,5,5,5,4,3,1,0,0,0,0,0,0,0,0,0,0,
+1,7,16,32,59,90,116,135,144,143,133,116,95,76,66,65,66,67,66,65,65,68,76,83,80,70,64,60,59,64,77,93,126,129,138,153,173,198,220,238,248,244,231,223,204,176,156,146,
+144,144,134,117,96,74,51,32,18,11,7,6,7,10,16,25,47,88,150,205,231,245,246,228,192,141,110,92,73,66,72,80,89,97,105,113,122,132,140,148,157,166,173,179,183,185,182,175,
+161,142,120,98,77,60,48,40,35,32,33,37,42,47,53,60,71,85,101,120,140,157,171,180,184,183,180,174,168,160,151,143,135,126,117,108,102,101,104,114,127,141,153,163,168,165,160,158,
+157,156,155,154,155,156,159,161,155,140,130,124,122,120,112,105,95,74,47,26,12,4,0,0,0,2,6,12,20,32,49,73,101,121,128,122,107,89,69,51,40,34,29,27,26,25,23,26,
+34,45,60,81,97,103,103,103,98,92,85,81,77,76,77,77,76,77,77,76,77,77,76,77,79,78,79,80,79,79,79,79,77,77,77,76,77,79,82,87,92,96,101,106,112,115,117,117,
+116,116,117,115,111,105,97,90,85,81,79,79,79,78,79,79,78,77,77,77,81,90,104,121,140,156,170,179,183,181,180,185,190,191,188,180,169,161,160,162,158,147,141,140,143,143,139,134,
+205,219,232,242,247,250,248,231,188,129,89,71,46,22,10,11,25,48,73,96,112,120,117,104,86,71,56,41,27,19,14,12,12,18,36,70,110,164,216,240,245,232,217,197,153,107,83,80,
+86,93,101,109,117,125,134,142,149,157,164,172,179,185,189,192,191,187,182,174,165,155,149,144,140,137,137,139,142,147,153,161,169,178,187,194,200,203,203,201,196,189,181,171,160,151,143,135,
+126,117,109,100,92,84,77,75,78,87,104,128,156,171,171,170,167,163,159,153,142,133,127,118,101,83,74,70,67,62,50,38,21,9,2,0,1,8,17,29,48,67,76,76,77,77,79,86,
+104,142,180,198,203,204,200,192,184,177,171,165,160,157,155,154,154,155,167,193,211,216,216,216,215,215,215,216,216,216,217,217,216,217,217,216,216,216,216,217,216,216,216,217,216,217,217,217,
+217,217,217,219,220,222,226,231,233,234,235,237,238,238,239,239,238,238,238,238,238,237,234,231,228,224,220,219,217,216,217,217,217,217,217,217,215,215,214,215,217,221,225,232,240,243,244,247,
+249,249,247,242,229,213,203,200,198,199,204,212,217,214,205,202,253,250,241,231,222,202,155,91,36,6,0,0,0,0,0,0,0,1,9,22,40,63,86,106,118,121,121,116,103,92,81,75,
+73,71,64,59,64,86,126,172,214,234,243,249,241,211,173,146,132,126,129,135,141,147,152,157,162,166,170,175,182,187,192,196,198,201,203,204,204,204,205,205,203,201,199,198,197,197,198,201,
+202,204,204,204,203,203,202,201,199,196,190,183,173,164,157,149,140,131,124,119,114,110,106,105,110,119,131,142,151,154,146,129,107,91,82,69,53,42,36,29,20,14,13,18,25,30,36,52,
+67,76,78,79,86,111,140,162,188,210,216,217,217,217,217,216,219,230,241,244,246,249,251,253,255,255,254,254,252,251,249,249,249,248,248,246,238,235,233,234,234,233,233,234,234,234,236,237,
+238,238,238,237,238,238,238,238,238,238,237,238,239,240,240,240,240,240,240,241,242,241,243,243,242,240,238,237,235,234,234,234,234,234,234,234,235,238,240,242,245,246,245,243,241,238,238,237,
+235,234,234,234,234,235,235,235,237,239,241,242,244,243,242,239,234,229,228,229,230,231,237,240,242,243,245,246,248,249,250,251,185,144,113,97,83,51,15,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,5,14,31,47,63,79,96,111,118,122,124,125,125,126,124,122,123,127,139,159,177,193,221,246,255,250,236,212,183,168,165,168,171,174,177,179,179,176,176,177,179,183,187,
+191,195,197,198,200,201,202,203,203,203,202,200,200,199,198,198,196,194,191,188,185,182,179,177,177,177,178,180,181,179,175,172,168,164,161,158,158,159,160,166,170,172,169,155,130,104,76,51,
+31,22,17,14,11,11,17,34,60,77,87,111,138,152,166,192,210,216,217,218,222,234,243,245,244,235,229,228,228,228,228,228,226,212,187,174,171,172,175,178,182,187,192,198,205,209,210,212,
+212,213,210,196,178,170,170,170,170,169,170,170,170,170,171,171,171,171,171,170,171,171,171,170,169,166,157,149,145,141,140,140,139,139,138,132,127,121,119,117,114,110,105,103,101,100,100,100,
+99,100,100,100,101,104,108,116,127,138,149,161,168,169,170,170,170,169,169,170,172,176,180,186,191,194,192,182,165,145,128,113,102,96,97,98,98,105,128,158,173,174,171,170,168,175,191,202,
+31,7,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,11,21,35,48,60,68,72,76,84,92,98,100,100,101,104,108,114,134,169,207,236,250,
+249,225,192,169,153,140,139,142,145,146,147,147,149,153,158,163,167,171,175,177,180,183,185,187,188,189,189,189,189,188,187,186,183,181,177,173,169,163,158,154,150,148,147,148,151,151,150,148,
+148,146,142,137,134,134,135,143,151,151,143,132,117,98,76,54,35,26,31,50,72,90,121,162,199,216,222,233,243,245,246,243,234,230,228,228,226,214,190,171,145,114,99,97,97,97,97,97,
+93,75,50,37,35,35,35,35,37,39,43,51,61,71,80,86,89,91,95,94,91,90,90,89,88,89,89,89,89,88,81,73,70,70,70,69,69,69,69,69,65,58,48,36,28,22,20,21,
+21,21,18,14,10,8,7,6,6,5,5,5,5,5,5,4,4,4,4,4,3,2,3,5,11,20,33,50,66,76,80,85,92,94,93,92,92,96,103,116,129,133,127,116,102,85,64,43,
+24,11,4,3,4,5,12,24,34,36,35,35,35,42,61,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,4,8,15,23,31,35,
+36,39,43,48,52,54,50,45,41,40,42,46,59,85,125,179,227,246,241,227,202,165,141,124,115,113,116,120,126,132,139,144,149,153,157,160,164,167,169,171,172,173,174,174,174,172,171,169,
+167,164,160,158,157,156,155,154,153,151,149,147,144,141,138,134,131,126,118,110,101,91,82,77,76,75,71,72,81,92,99,102,107,125,152,182,208,221,234,245,246,235,228,217,194,176,166,141,
+112,99,97,96,92,74,50,33,20,9,5,5,5,5,5,5,4,1,0,0,0,0,0,0,0,0,0,3,9,18,25,28,29,30,33,37,39,39,34,25,18,15,13,12,12,12,8,4,
+3,3,4,6,8,11,12,12,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,17,25,34,41,48,54,58,62,65,66,68,
+70,68,63,57,51,43,37,36,42,45,44,49,61,76,84,85,76,59,37,16,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,5,4,4,4,4,2,0,0,0,0,0,
+0,0,0,0,0,0,0,0,4,24,36,42,46,49,50,51,52,53,54,55,57,59,59,56,50,44,42,41,42,45,56,85,137,192,228,245,251,241,226,202,172,151,138,131,126,124,126,129,
+133,137,142,145,148,151,154,155,156,158,159,159,159,158,157,156,156,156,159,165,173,178,180,180,178,175,172,167,160,153,145,139,135,131,127,123,119,112,101,87,75,64,56,58,77,101,119,151,
+195,231,248,251,243,231,214,185,150,113,95,78,53,37,29,18,7,3,4,7,8,6,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,23,34,38,41,44,47,48,
+48,49,49,49,49,50,49,42,32,23,17,13,11,11,11,13,17,20,23,27,33,38,39,39,36,31,26,20,13,6,0,0,0,0,0,0,1,1,1,1,1,3,4,4,4,5,6,8,
+12,20,34,56,81,100,111,117,119,119,117,113,106,98,92,88,86,86,86,85,84,79,70,58,45,32,16,6,8,18,34,52,71,84,87,75,51,25,10,2,0,0,0,0,0,0,0,0,
+21,28,40,50,56,56,56,55,55,53,46,35,30,25,14,7,6,14,24,26,26,25,25,25,38,61,70,67,64,60,57,58,61,66,69,70,66,59,56,58,62,64,65,68,71,74,76,79,
+89,111,140,174,212,236,248,252,243,229,213,197,177,156,139,134,133,136,141,146,149,150,150,151,154,159,164,165,166,165,166,169,173,179,186,193,195,194,190,185,180,174,168,163,157,148,137,125,
+115,106,102,98,98,104,113,123,138,153,166,178,198,214,219,231,244,239,216,191,170,152,129,95,62,36,24,20,21,24,26,26,21,24,35,47,55,57,57,57,57,56,48,36,30,26,23,27,
+47,78,93,95,95,95,95,94,104,121,122,101,80,63,43,31,30,34,38,40,36,33,37,44,50,51,49,48,48,48,48,49,50,51,50,47,45,40,39,40,47,60,68,71,69,65,61,54,
+42,29,30,36,38,35,32,32,34,45,56,58,58,59,63,72,84,100,121,138,149,150,145,140,133,126,121,117,110,101,89,78,68,61,57,58,61,70,78,84,86,82,67,43,22,9,2,4,
+13,31,55,77,88,83,70,54,37,24,17,17,21,25,28,28,83,84,84,83,82,84,90,97,100,102,103,104,112,121,125,138,145,161,178,182,181,180,179,179,181,185,187,186,188,190,191,193,
+196,199,201,202,196,183,161,129,96,78,68,60,58,60,62,62,60,60,63,74,99,129,167,209,233,245,250,248,240,222,198,183,173,161,153,149,146,146,145,144,147,154,162,165,164,165,166,170,
+173,175,176,170,160,152,143,137,132,129,125,124,124,127,129,129,129,132,138,141,140,152,172,193,218,237,248,252,251,244,237,226,199,155,108,83,87,103,118,127,123,109,97,90,93,100,103,104,
+99,92,89,89,86,85,85,85,84,84,83,90,108,135,167,189,208,226,230,231,230,230,229,229,230,230,229,221,212,199,166,127,99,92,86,73,63,53,47,46,46,45,42,39,39,38,36,32,
+26,21,23,29,35,46,73,97,127,166,187,192,195,200,205,206,187,143,105,83,63,51,48,49,52,67,82,85,85,85,90,99,107,114,119,111,98,85,74,68,66,64,63,67,74,83,88,90,
+87,80,71,64,58,57,57,61,69,83,97,99,89,73,54,38,30,30,37,51,74,99,117,127,123,110,97,91,93,101,104,103,70,61,61,81,117,141,165,185,192,196,198,204,214,228,241,253,
+255,252,249,247,247,247,246,246,246,242,230,221,219,220,221,221,221,219,218,218,222,231,241,244,225,203,179,136,91,68,62,58,57,57,56,52,54,61,79,108,137,169,199,223,241,250,248,240,
+228,207,182,163,158,157,153,146,144,142,137,132,127,123,123,124,123,121,118,112,104,98,93,88,85,81,79,83,92,108,128,151,180,206,226,234,236,242,248,251,249,241,227,213,202,189,179,162,
+136,113,97,87,88,99,114,127,134,130,116,102,94,92,92,92,90,79,62,43,30,28,27,25,26,40,85,156,207,237,250,241,227,201,176,167,165,165,164,162,163,162,168,187,204,220,238,244,
+235,225,205,168,135,116,101,87,80,74,66,55,47,44,39,33,41,71,115,154,177,198,220,230,231,219,208,209,211,214,214,216,229,235,216,185,132,68,22,9,11,19,27,28,29,27,29,33,
+33,33,32,23,15,10,7,5,5,5,5,8,13,22,34,46,60,71,79,83,85,86,84,82,81,85,97,112,125,132,129,116,104,99,93,85,86,97,112,125,133,129,115,100,93,90,89,88,
+99,123,162,205,228,229,219,203,195,198,198,199,203,217,241,250,250,250,246,241,239,239,241,241,243,243,228,191,147,109,82,68,63,60,57,58,65,81,111,158,201,221,238,243,216,171,131,111,
+103,100,93,83,79,81,83,86,92,103,118,136,160,195,227,239,245,248,241,232,230,230,227,220,219,213,196,180,160,145,142,141,140,138,137,136,134,132,130,127,128,134,137,153,175,195,213,226,
+239,245,241,232,228,221,205,191,170,141,120,107,104,104,104,96,88,86,79,66,61,59,57,52,50,47,38,27,20,18,17,16,14,8,2,0,0,0,0,27,80,142,204,229,208,180,139,114,
+130,141,123,92,72,67,71,73,74,74,75,77,75,78,99,138,168,184,212,228,224,212,190,158,135,121,118,120,116,108,115,141,184,225,243,233,218,205,177,152,132,101,84,81,76,68,59,55,
+78,133,178,211,234,207,127,55,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,13,21,28,35,42,51,57,62,66,71,80,90,100,102,95,
+87,85,77,63,57,56,54,50,47,44,35,23,16,17,35,66,228,232,222,188,134,96,69,45,37,39,39,39,41,53,90,114,126,150,168,169,153,134,123,119,122,151,203,228,220,186,132,71,
+27,3,0,0,0,2,7,20,43,63,101,162,215,238,226,200,172,130,85,62,58,60,63,65,67,67,65,62,65,84,117,140,168,200,225,236,236,237,245,254,255,255,251,247,239,232,230,229,
+229,229,229,228,228,228,228,226,230,238,240,244,251,253,254,253,251,245,226,198,173,145,107,75,50,32,24,22,25,26,24,20,17,15,12,8,6,6,4,2,0,0,0,0,0,0,0,0,
+0,0,0,7,24,56,111,178,226,230,193,114,50,22,5,7,36,75,100,93,63,33,16,11,10,10,10,6,1,0,0,5,17,36,82,135,189,236,252,248,240,229,224,226,224,212,219,237,
+234,201,147,98,73,62,49,40,38,35,29,22,14,8,4,3,4,12,28,59,121,198,235,213,166,103,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,4,7,10,13,18,22,24,23,19,15,15,12,7,5,4,3,0,0,0,0,8,50,102,162,208,134,104,70,32,8,0,0,0,0,0,0,0,0,0,6,12,
+21,44,79,117,126,96,56,26,10,14,48,98,150,200,230,222,181,123,68,27,6,1,2,3,3,4,8,25,65,127,187,215,232,222,163,99,65,58,65,69,70,70,67,66,66,66,61,56,
+66,89,116,132,134,138,163,204,223,218,202,208,225,234,235,236,235,235,235,235,234,234,234,233,237,244,243,236,226,218,212,208,206,210,221,228,226,217,199,174,146,115,79,53,44,39,37,34,
+29,28,28,25,17,8,3,2,1,0,0,0,0,1,9,20,38,62,92,138,178,212,232,211,151,87,37,3,0,0,6,9,18,39,75,114,125,96,59,41,33,27,24,25,31,50,82,101,
+111,142,174,192,218,230,210,201,208,216,221,225,225,206,178,139,89,41,16,8,9,16,27,32,33,34,31,29,28,26,24,22,18,14,10,6,12,50,120,179,223,233,199,131,66,32,9,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,8,10,10,8,8,7,7,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,25,71,137,206,233,224,182,
+6,0,0,0,0,0,0,0,0,0,3,17,40,64,77,82,89,98,110,135,155,153,133,104,73,49,30,23,29,53,100,156,208,231,217,174,117,60,17,2,2,4,5,4,5,15,38,66,
+110,181,229,226,204,194,198,201,202,202,202,201,201,195,169,124,86,56,46,49,51,55,66,87,104,99,88,94,112,125,128,129,128,127,126,126,123,123,121,120,122,131,130,121,111,107,103,101,
+104,113,132,154,173,190,208,225,234,237,227,211,203,195,193,189,184,182,182,178,163,138,120,117,110,107,106,102,97,109,144,173,198,219,229,229,207,172,117,54,11,0,0,13,38,62,76,83,
+95,108,126,157,187,199,197,199,197,192,186,185,192,208,224,228,228,221,203,188,166,112,53,39,43,50,54,59,59,43,25,11,4,6,11,18,26,46,69,77,80,81,81,81,80,75,69,60,
+50,40,31,25,17,10,13,32,72,134,201,232,219,189,140,82,38,11,1,0,0,0,0,0,0,0,0,8,21,33,39,44,53,64,72,75,75,75,77,76,75,70,60,44,26,12,4,0,
+0,0,0,0,0,12,51,88,118,173,222,230,187,123,74,29,0,0,0,0,0,0,1,9,20,36,61,90,113,122,119,116,114,108,103,97,94,99,111,122,124,119,111,101,88,71,53,48,
+73,118,172,217,233,211,147,75,29,14,12,19,27,33,39,44,51,78,129,173,201,211,211,210,209,210,212,212,214,220,236,239,218,168,111,71,53,41,39,41,42,41,41,44,47,50,50,49,
+48,48,47,46,47,49,49,49,53,62,77,94,107,114,114,113,110,106,98,91,89,88,92,103,117,141,175,196,203,206,207,209,211,209,206,207,215,224,227,227,227,227,226,227,227,228,223,205,
+181,152,121,82,43,17,3,6,20,44,76,105,129,148,165,183,202,217,225,232,240,242,240,236,231,232,232,230,222,204,168,134,116,84,50,32,18,3,0,0,0,0,1,8,16,25,35,45,
+53,60,67,71,76,89,105,113,119,126,131,135,136,133,128,120,108,92,75,58,43,31,19,11,5,13,50,110,162,202,229,225,194,148,116,90,65,50,44,42,45,55,72,93,111,122,124,127,
+133,149,163,166,165,170,180,186,186,179,167,157,141,119,95,69,49,44,49,69,98,145,204,228,229,216,163,95,35,2,0,0,11,11,12,15,22,32,50,75,96,112,122,119,100,72,52,45,
+40,32,25,19,14,15,25,43,63,83,98,108,114,119,117,105,90,82,87,107,150,202,235,223,183,143,105,91,98,106,114,118,119,117,118,123,129,127,114,96,83,78,77,77,80,92,127,169,
+213,240,233,208,177,118,78,72,72,74,76,83,87,88,88,88,88,86,84,85,90,96,100,108,121,132,140,141,134,122,112,105,95,84,73,66,61,57,53,50,47,45,49,55,62,74,82,91,
+100,104,104,103,113,130,138,136,135,134,127,126,130,131,112,85,65,50,42,43,47,64,102,136,160,190,216,226,226,229,234,234,224,207,193,174,139,108,93,85,90,105,118,125,129,128,121,108,
+94,81,68,51,41,39,41,41,46,56,72,87,99,108,117,124,130,137,144,151,153,155,157,161,168,174,178,179,180,180,178,172,163,151,138,124,110,93,78,67,60,52,50,59,75,99,140,180,
+215,236,238,234,225,216,210,208,208,212,218,222,222,218,215,214,217,230,235,234,234,234,234,233,229,228,230,235,243,243,234,215,196,195,208,225,238,238,206,160,132,95,46,16,8,9,10,11,
+82,82,84,91,100,109,118,121,112,99,78,49,24,7,1,0,0,0,0,0,0,0,0,0,4,11,19,26,36,56,82,104,121,130,131,127,127,142,176,211,234,244,226,184,146,117,100,91,
+90,93,94,99,110,120,124,120,113,108,99,92,92,95,100,112,137,174,216,241,254,235,185,145,133,132,134,134,134,133,133,134,133,131,134,142,151,162,180,202,220,222,216,209,201,195,192,191,
+188,186,185,184,184,183,183,184,181,174,157,124,103,104,111,117,126,135,144,150,154,158,161,161,159,157,154,151,155,176,192,196,198,198,202,209,214,225,242,248,246,238,218,202,189,168,136,100,
+70,45,32,21,7,0,0,0,1,9,19,27,39,57,79,99,110,117,122,120,116,114,114,115,117,121,122,119,115,113,111,111,119,131,146,165,183,192,192,182,163,143,129,123,126,140,160,178,
+189,188,182,177,174,165,153,142,136,130,127,125,121,118,118,124,140,159,173,191,207,217,221,224,224,220,215,208,204,200,198,199,191,161,128,117,117,117,114,110,107,110,128,147,177,222,244,247,
+249,252,255,255,251,229,169,119,102,98,96,89,83,82,82,82,117,117,117,115,110,101,85,60,38,22,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,28,62,98,134,162,
+189,202,207,212,213,208,199,190,190,215,242,243,218,175,117,60,27,16,17,25,37,53,76,101,126,141,134,126,125,125,127,131,134,133,138,151,187,231,242,209,171,135,118,112,108,104,103,102,
+106,129,172,208,222,231,236,229,212,204,201,201,201,201,201,201,201,201,202,202,202,201,202,201,203,208,219,231,229,228,228,228,229,230,231,232,233,234,235,239,240,242,243,246,245,240,231,227,
+227,227,226,222,219,210,179,145,120,89,53,37,30,19,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,11,23,35,46,62,78,86,88,88,88,85,75,63,52,44,43,48,57,
+75,98,127,154,176,180,156,110,60,29,15,12,14,25,50,94,144,181,195,192,182,165,145,129,117,108,98,85,75,70,67,66,65,64,66,69,69,68,69,69,66,58,50,43,40,39,39,39,
+33,16,3,1,1,2,2,1,2,2,8,17,26,66,126,143,136,129,133,159,190,223,231,203,167,127,103,105,112,114,116,116,45,45,45,40,32,23,12,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,9,28,68,129,186,219,228,226,218,205,197,196,197,199,204,213,223,226,229,235,242,250,252,239,200,143,74,24,4,0,5,11,25,45,61,60,56,55,57,58,63,
+69,65,57,50,53,84,139,201,229,207,189,191,194,191,189,188,196,220,233,211,186,163,127,89,58,50,49,48,48,47,47,46,46,45,45,44,43,44,43,43,44,48,65,100,118,119,119,118,
+118,116,117,116,116,116,116,118,120,122,125,125,119,97,79,73,74,74,73,66,59,47,25,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,3,10,14,15,15,15,13,10,8,9,13,21,34,53,76,107,138,164,170,141,80,22,0,0,0,0,0,0,0,12,64,133,180,190,174,144,113,85,63,45,32,20,12,9,5,5,
+5,4,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,15,10,3,3,12,31,80,156,209,232,212,145,80,46,41,42,43,
+5,3,4,4,2,1,1,2,3,3,3,3,3,3,3,2,2,2,1,1,7,32,87,143,182,218,231,208,166,124,93,71,52,43,44,44,45,50,64,90,113,121,121,127,144,175,212,244,
+252,226,182,111,41,20,14,12,12,9,7,5,4,5,5,6,8,8,8,7,7,13,44,124,211,247,254,254,246,217,203,202,198,176,123,64,37,25,14,8,6,5,5,4,4,3,2,2,
+2,1,1,1,0,0,0,0,0,0,0,1,2,4,10,16,13,6,4,4,4,4,3,2,1,0,1,0,1,1,2,2,2,2,2,2,0,0,0,0,2,2,3,3,3,3,3,3,
+4,4,4,4,5,5,4,6,6,6,6,7,7,7,8,7,8,9,9,8,8,8,9,9,9,11,14,17,24,32,46,65,90,120,150,172,165,118,46,0,0,0,0,0,0,0,0,0,
+29,103,165,186,174,144,110,79,54,34,21,12,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,7,
+5,2,0,0,0,1,19,53,111,193,231,193,118,79,45,16,113,86,67,60,60,59,59,59,59,59,59,59,59,59,60,62,62,64,73,98,138,190,231,239,225,191,143,99,71,59,54,53,
+53,54,54,46,38,36,37,38,41,42,42,44,49,60,92,155,225,254,255,244,199,166,150,143,132,108,83,68,57,49,45,44,45,57,76,89,103,133,175,214,229,219,201,168,121,67,48,48,
+43,30,14,6,5,6,6,7,7,7,7,6,6,5,5,4,4,4,4,3,3,3,3,2,2,2,1,0,0,0,10,31,44,41,39,41,45,49,51,48,42,39,38,39,43,52,59,60,
+60,60,60,60,60,60,61,61,61,61,61,61,61,61,62,62,62,62,63,63,64,64,65,71,70,64,61,61,62,62,63,63,63,65,65,58,51,49,50,50,50,51,53,55,60,66,84,106,
+128,152,175,191,186,149,80,18,0,0,0,0,0,0,0,4,50,122,174,187,170,139,105,76,51,32,19,12,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,16,22,23,24,28,34,38,40,37,41,77,149,220,236,229,204,158,244,227,196,173,173,158,137,131,133,134,135,137,143,154,169,179,
+183,189,208,236,249,238,205,168,138,104,84,81,82,83,84,85,85,86,81,63,46,42,42,42,41,41,41,41,41,43,56,84,123,171,207,217,234,245,247,249,249,243,233,223,216,210,205,204,
+205,216,228,234,235,235,223,188,135,86,56,30,11,3,2,2,2,4,6,6,6,6,6,6,6,6,5,4,5,4,4,3,3,3,3,2,3,2,2,2,2,1,0,0,0,0,9,38,
+65,75,77,83,91,99,105,108,110,110,111,112,115,119,119,118,119,119,119,120,120,121,121,121,121,121,122,122,122,122,123,123,123,123,122,122,122,122,124,127,118,100,90,90,90,92,92,93,
+94,95,91,75,59,56,57,57,57,57,59,61,65,71,91,119,141,160,183,200,206,194,155,96,42,13,3,1,2,9,27,68,124,170,191,186,168,142,114,87,62,42,25,14,6,1,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,12,24,34,41,50,63,74,84,91,95,96,109,144,176,199,229,247,
+172,211,237,245,249,238,216,205,206,210,213,218,225,234,238,238,237,236,226,197,148,104,77,65,53,35,28,28,28,29,29,29,29,28,25,15,7,6,6,6,6,6,6,6,6,7,14,25,
+29,38,58,76,99,117,130,141,154,175,198,211,220,223,227,232,234,224,206,193,185,169,146,122,102,88,74,65,55,38,21,10,6,3,4,5,5,5,5,5,5,5,4,4,3,3,2,3,
+2,3,2,2,1,1,1,1,0,0,0,0,0,0,7,30,52,52,45,46,51,55,59,67,76,84,88,93,97,98,93,91,92,95,100,106,114,120,122,122,122,123,123,124,124,124,126,125,
+122,118,112,104,99,96,97,96,87,72,66,65,62,57,51,48,48,48,46,38,30,30,31,31,31,30,30,33,35,40,51,68,85,104,129,155,175,186,187,173,147,119,99,92,97,114,139,167,
+187,194,189,179,169,160,148,133,119,102,84,70,56,35,16,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,
+16,21,23,27,34,41,48,57,68,76,79,80,82,83,96,128,19,49,93,156,217,244,252,249,236,213,195,182,169,150,123,103,96,87,65,34,9,1,1,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,9,14,23,36,49,61,68,74,84,95,90,77,71,77,86,96,109,123,137,146,145,141,126,101,75,
+52,28,11,3,1,3,3,4,3,3,3,3,3,3,2,2,2,1,1,2,1,0,0,0,0,0,0,0,0,0,6,16,18,11,5,4,6,9,16,26,37,54,78,101,119,136,142,144,
+148,154,162,172,184,191,193,194,194,194,194,195,195,195,196,196,193,186,177,162,149,145,145,145,144,143,143,141,133,116,93,75,61,53,48,44,41,38,36,36,37,36,34,35,35,36,38,41,
+49,59,75,94,115,135,153,166,175,179,178,179,181,184,184,180,173,161,146,133,125,123,123,127,134,145,151,148,141,124,99,72,49,25,6,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,5,3,2,3,3,3,6,9,12,13,13,12,8,4,7,0,0,0,14,57,106,161,213,233,216,167,94,38,12,4,2,
+0,0,0,0,1,2,3,1,0,0,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,0,0,0,3,16,27,34,
+40,45,51,59,68,78,89,104,121,139,153,154,150,151,149,140,128,105,70,37,15,4,1,1,1,1,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,2,6,14,21,
+25,27,29,33,46,68,93,114,132,157,188,208,221,231,235,235,236,239,241,243,245,246,246,246,246,245,245,246,246,246,246,246,246,245,244,241,236,234,235,235,236,236,236,236,232,223,206,186,
+167,151,137,123,108,91,78,69,63,57,54,52,50,50,49,49,49,53,57,66,77,89,101,114,125,134,139,142,141,138,132,123,112,101,91,85,83,84,88,99,112,130,144,149,151,154,151,140,
+127,104,69,35,13,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+3,3,4,9,14,23,43,89,149,202,231,214,161,119,123,137,133,125,124,127,127,127,126,117,101,84,72,63,60,59,59,60,60,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,
+61,61,61,61,61,60,59,59,62,70,81,98,133,170,187,193,194,197,203,208,210,210,209,210,210,209,207,195,157,114,91,89,102,123,129,118,95,68,42,16,2,0,0,0,0,0,0,0,
+0,0,0,2,3,5,8,12,20,27,32,39,51,70,91,113,128,136,140,147,165,191,213,225,232,240,247,247,243,238,235,234,233,230,227,223,217,213,212,212,214,216,217,218,219,219,219,221,
+223,229,235,242,246,246,246,246,247,246,246,247,248,251,251,249,245,240,235,227,216,200,184,169,152,136,123,114,108,104,103,101,98,97,97,98,99,102,105,107,110,110,111,108,103,100,101,101,
+99,103,109,114,113,106,97,91,84,76,70,69,72,76,79,86,102,122,127,111,83,54,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,62,70,83,94,99,98,98,108,132,173,220,243,243,250,255,255,254,249,247,248,247,248,246,240,226,209,187,162,145,133,125,
+121,117,115,116,117,117,118,119,119,119,119,119,119,119,119,118,117,116,116,116,116,121,132,143,167,202,225,239,247,243,237,238,235,234,229,222,214,209,204,201,200,197,200,216,225,199,161,126,
+109,121,148,171,180,174,156,124,88,61,46,35,26,23,22,24,27,29,31,36,49,67,79,94,117,135,145,155,171,192,210,224,232,234,235,238,242,246,247,243,238,231,218,199,180,167,163,165,
+168,164,161,161,159,158,158,158,162,166,169,170,172,173,174,177,181,188,194,203,210,212,213,213,214,214,215,216,222,231,239,245,249,251,254,254,254,253,249,245,235,223,207,190,175,164,157,152,
+149,146,144,142,140,138,137,135,134,131,130,127,126,126,135,141,136,136,130,109,85,66,48,33,21,12,7,4,4,5,6,10,21,46,79,109,123,122,103,68,32,8,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,10,19,28,38,48,121,120,121,118,112,106,104,103,98,90,88,105,131,147,164,179,
+192,196,164,146,147,146,149,160,180,203,222,235,236,227,210,194,178,146,111,90,83,80,74,67,64,64,64,64,64,64,66,68,76,87,95,105,128,171,209,227,238,232,207,183,153,126,120,120,
+106,94,79,61,51,51,56,61,69,81,104,146,201,234,243,239,228,220,222,229,235,240,243,241,230,212,190,163,137,122,119,121,126,131,130,135,158,186,201,212,226,234,238,240,244,247,247,245,
+241,238,236,233,226,211,190,171,162,156,145,135,130,129,131,133,133,131,129,125,118,114,114,114,113,111,110,114,117,120,123,126,129,130,128,132,137,140,142,143,144,145,146,148,153,163,174,188,
+200,209,217,226,235,243,247,250,250,249,243,231,212,190,170,148,129,114,104,98,93,90,87,85,83,81,82,87,95,97,105,106,90,75,59,34,15,7,1,0,0,0,0,0,0,0,0,0,
+0,0,9,32,58,87,114,124,106,73,41,19,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,18,37,57,76,94,105,112,118,
+70,67,61,49,37,31,34,43,48,48,45,44,44,43,40,36,36,34,16,7,8,8,9,12,20,38,63,101,145,177,201,216,223,227,210,187,176,169,148,115,100,99,99,100,99,104,110,124,
+153,182,196,207,223,227,204,178,143,86,43,25,16,13,15,14,6,4,9,21,43,75,104,124,139,162,188,210,226,235,242,247,250,251,250,249,247,247,249,254,255,255,252,246,238,231,227,228,
+229,230,229,231,239,246,247,247,244,238,234,231,225,211,192,173,156,146,143,140,132,120,109,107,117,126,127,122,113,103,93,83,71,67,62,52,42,39,45,57,67,71,75,80,85,88,89,88,
+89,90,89,92,95,100,102,103,106,113,124,132,136,145,161,180,187,192,196,204,215,225,233,240,245,248,250,249,244,235,221,198,167,131,96,68,50,38,30,26,22,19,18,19,22,24,25,23,
+15,9,4,2,2,2,2,4,8,11,12,12,12,12,12,12,12,12,9,6,6,16,41,78,111,123,115,92,65,43,23,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,2,7,16,28,43,60,84,105,114,116,111,102,92,83,5,3,1,1,9,25,47,67,78,82,82,82,81,78,72,60,45,30,17,7,1,0,0,1,11,25,38,52,70,86,102,115,
+127,152,180,198,204,208,221,229,229,228,228,229,228,229,229,229,220,202,188,174,151,99,46,23,9,0,0,0,0,0,0,3,22,57,103,141,175,205,226,236,242,247,251,252,248,245,242,238,
+231,224,217,208,197,186,186,196,213,228,235,241,246,248,248,245,241,238,236,232,223,210,200,190,171,151,138,128,115,95,78,68,69,75,83,92,103,111,116,117,111,93,72,53,37,25,17,11,
+5,5,5,8,18,38,61,84,99,108,113,119,124,128,129,127,123,119,116,114,113,116,124,139,164,191,213,222,226,231,239,245,245,244,242,241,242,242,244,246,248,249,251,252,253,253,252,249,
+242,224,191,147,104,67,41,25,16,11,8,6,4,3,2,3,9,18,30,40,44,46,51,66,84,91,95,94,92,87,79,74,72,71,68,60,45,28,15,17,38,69,98,117,121,114,97,71,
+46,30,22,18,13,8,4,2,1,1,1,1,1,3,6,12,21,32,42,55,72,87,99,105,103,88,69,53,37,25,17,11,0,4,16,35,60,80,87,81,70,63,62,63,65,70,80,93,
+102,106,101,83,65,54,50,57,73,85,88,86,81,74,72,74,80,89,94,89,74,63,76,103,116,117,116,117,117,114,106,95,69,42,29,20,10,0,0,0,0,0,0,0,4,18,46,85,
+135,184,222,240,248,252,253,251,251,248,242,231,220,212,202,184,159,138,126,121,117,111,103,96,101,111,121,139,158,180,193,196,192,187,181,172,158,136,118,104,89,77,69,66,63,65,73,89,
+107,120,125,122,111,94,79,65,45,23,8,0,0,0,0,0,1,8,21,42,70,92,102,103,98,99,105,114,123,133,146,159,169,174,173,167,163,171,198,228,245,251,247,242,240,239,231,220,
+219,221,221,218,213,208,204,203,207,216,226,233,236,239,243,248,251,253,250,236,206,164,117,75,47,27,14,8,6,12,27,46,63,78,87,90,90,92,103,125,141,147,147,148,149,146,131,110,
+93,82,80,85,88,85,68,46,28,21,28,50,74,97,114,119,113,101,93,90,82,67,53,45,41,39,36,35,36,41,50,63,78,90,97,99,93,82,70,59,41,21,7,0,0,0,0,0,
+52,63,76,85,85,72,55,39,31,30,37,45,51,56,68,89,112,133,141,128,114,107,100,90,79,61,45,33,23,17,15,17,28,46,69,84,83,67,45,28,14,6,3,2,1,0,0,0,
+0,0,1,1,1,0,0,0,0,5,18,44,81,124,164,201,230,246,250,246,236,218,195,179,172,161,142,123,114,120,126,119,100,75,53,44,47,64,83,94,91,79,67,64,72,88,104,114,
+116,114,112,117,117,108,100,95,93,91,90,91,97,109,123,133,139,143,144,133,113,89,69,52,42,36,30,26,24,24,27,35,50,64,80,94,97,87,74,67,69,79,95,111,123,135,149,166,
+182,199,210,213,218,232,247,245,229,211,195,187,184,183,179,175,179,186,194,200,200,195,188,180,175,174,175,177,178,180,188,199,215,233,246,250,248,238,215,181,144,104,67,48,50,67,84,92,
+89,80,66,53,48,48,56,68,75,77,77,78,86,101,110,106,90,68,50,41,47,63,80,88,81,63,47,45,52,64,82,97,105,108,111,120,123,113,106,104,104,102,98,95,97,99,102,107,
+113,118,122,115,101,83,72,66,61,57,52,44,34,28,31,38,156,149,135,120,104,95,96,101,102,99,96,91,87,85,86,86,85,82,74,60,54,54,50,36,19,7,1,0,0,0,0,0,
+0,2,14,36,60,81,89,84,71,57,48,41,39,39,39,40,46,53,56,57,55,52,50,53,64,90,128,168,202,225,237,246,248,239,215,176,136,97,64,46,38,31,22,13,12,23,42,65,
+84,92,85,65,41,27,30,47,66,80,83,84,91,99,105,108,104,94,81,74,73,73,75,78,80,81,85,99,132,175,200,204,205,207,210,211,211,207,193,167,148,129,112,109,108,102,99,103,
+106,105,100,91,81,75,78,90,105,120,134,144,153,161,169,179,195,218,237,245,248,245,223,196,181,175,173,173,174,174,177,178,179,181,185,192,200,205,207,205,200,194,187,181,176,170,167,165,
+171,188,208,223,236,246,248,244,235,217,189,161,136,116,95,74,54,37,22,13,10,10,12,14,15,15,15,15,18,31,51,73,91,97,91,72,50,40,48,68,88,101,103,106,113,123,134,147,
+158,166,170,173,173,168,167,174,183,186,183,181,182,181,179,178,179,181,186,188,189,189,188,188,190,190,189,178,154,145,152,157,238,231,222,218,215,214,215,212,202,187,161,124,89,65,47,31,
+21,13,6,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,22,42,63,77,85,87,88,88,87,87,86,87,86,90,95,104,121,143,164,183,209,232,243,248,248,244,233,
+204,159,105,59,30,13,4,0,0,0,0,0,0,10,26,46,69,94,116,124,113,85,51,32,40,67,103,140,172,195,201,204,209,208,203,192,185,183,184,185,186,190,197,212,232,236,224,219,
+219,219,220,221,223,227,237,245,243,233,221,219,219,205,178,152,132,123,117,114,115,120,125,131,136,139,144,149,159,176,200,218,235,250,255,248,230,201,183,179,180,182,183,185,185,186,187,188,
+189,189,188,189,191,195,200,204,206,207,205,203,198,193,186,178,169,163,161,168,182,207,231,244,250,252,250,239,211,177,153,134,120,105,88,78,74,73,73,73,72,72,73,72,74,80,91,105,
+122,139,156,163,157,146,139,139,144,150,156,171,196,216,228,238,245,249,249,246,242,239,236,237,238,240,245,247,248,248,248,248,248,248,249,249,250,251,251,251,252,252,252,251,244,241,244,243,
+235,241,245,245,244,244,246,246,245,241,229,204,167,125,80,44,26,18,12,6,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16,27,36,41,43,46,52,59,
+66,80,104,127,154,186,213,230,240,247,252,251,241,219,186,146,94,45,16,3,0,0,0,0,0,1,10,28,49,68,80,86,88,91,102,127,151,157,152,158,180,202,220,229,219,203,198,198,
+202,207,218,226,229,226,222,221,221,222,223,217,181,132,102,95,97,97,97,98,102,110,129,153,172,202,219,218,222,236,243,227,212,210,209,209,207,207,207,207,207,207,209,214,223,235,247,253,
+254,247,232,209,190,184,187,188,190,190,191,192,192,192,192,193,193,194,194,193,192,193,192,192,193,194,193,191,186,179,169,160,149,142,138,138,159,199,230,244,249,253,254,254,251,245,242,235,
+227,219,206,198,195,195,195,195,195,195,196,200,204,209,213,215,215,217,222,228,236,239,240,240,238,234,232,239,246,248,245,242,239,240,243,241,233,223,212,196,180,181,192,194,192,190,190,191,
+191,191,192,192,193,196,198,199,199,199,200,211,228,236,233,230,107,128,152,171,178,179,182,192,209,226,239,246,241,226,197,160,137,121,101,78,57,38,27,20,13,9,6,5,5,5,5,6,
+6,6,5,5,5,5,4,4,3,4,5,11,26,53,85,115,144,174,201,218,230,240,243,243,241,233,215,188,164,145,122,93,61,36,23,15,13,14,18,24,32,46,67,84,88,80,64,50,
+47,66,105,163,209,225,237,245,241,222,191,153,116,86,77,76,80,91,111,137,148,136,114,100,92,82,71,57,31,15,12,11,11,12,12,12,14,19,24,28,33,48,59,60,64,93,147,190,
+200,201,201,202,203,205,207,210,217,228,243,251,253,253,250,241,221,201,190,187,188,191,192,193,193,193,194,195,194,195,195,195,195,195,195,194,194,194,192,191,189,185,182,177,170,165,167,176,
+189,208,219,223,232,231,215,207,207,211,220,234,245,251,252,249,246,247,247,246,245,247,247,248,248,249,251,252,253,253,251,250,249,248,248,248,250,249,249,248,250,249,245,240,233,223,212,200,
+193,190,184,176,170,153,126,99,83,73,62,54,48,46,45,47,46,46,47,47,48,52,56,57,57,58,58,68,89,105,104,98,49,59,75,92,109,117,117,121,135,155,184,216,236,246,247,240,
+235,228,216,200,179,153,134,117,99,85,75,71,70,70,70,70,70,70,70,70,70,70,70,70,70,71,75,91,128,171,205,228,242,247,251,250,247,239,220,193,164,134,96,59,41,48,65,79,
+88,95,99,97,92,85,81,84,87,89,81,61,39,27,33,56,103,171,218,228,203,179,158,125,106,97,87,82,81,83,83,84,83,82,80,76,64,45,24,11,4,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,8,22,45,70,82,89,97,104,112,123,136,156,193,225,244,242,235,226,214,199,185,183,186,189,192,193,194,195,195,195,195,195,195,195,195,195,
+194,195,195,193,193,193,191,190,187,183,180,182,190,208,229,242,243,232,214,201,174,125,87,71,66,68,81,108,141,168,181,188,199,214,226,228,228,226,224,224,225,224,222,217,212,209,207,206,
+207,206,206,205,198,187,172,166,173,179,180,177,172,166,156,145,134,122,104,86,70,50,28,14,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16,29,39,44,
+129,133,136,137,138,141,143,143,143,146,155,176,200,223,239,244,245,246,248,248,245,239,233,225,216,206,198,194,193,193,193,193,194,194,193,193,193,194,193,193,193,194,197,210,229,243,248,247,
+246,241,233,237,243,243,231,204,154,84,33,9,0,0,3,17,39,68,101,128,143,134,111,96,89,74,58,58,82,126,175,208,228,213,160,98,45,24,12,1,1,9,19,30,44,64,84,101,
+104,98,91,81,73,64,51,38,31,21,12,8,1,0,0,0,0,0,0,2,8,15,29,51,69,78,87,99,112,124,131,134,137,144,158,174,191,210,224,236,250,246,230,213,208,207,206,204,
+203,204,201,199,197,195,194,193,194,194,194,194,194,193,192,192,192,192,190,190,189,187,185,183,182,189,207,228,242,247,233,205,174,140,111,93,72,52,38,29,22,18,16,22,32,42,51,62,
+84,115,147,170,182,177,162,152,147,138,126,115,105,96,90,88,87,87,85,82,75,64,50,42,42,48,55,63,74,88,96,97,92,83,71,59,48,38,22,7,3,4,8,6,2,0,0,0,
+0,0,1,3,8,11,19,28,36,42,55,71,89,107,120,126,126,121,115,112,111,111,111,111,115,122,128,134,144,163,187,205,213,218,226,233,240,242,241,242,245,246,246,247,248,248,247,247,
+248,248,248,248,248,248,247,248,248,248,248,248,246,234,209,178,157,134,107,107,124,141,172,209,232,210,167,130,87,48,33,30,19,12,25,52,83,105,114,120,121,123,153,199,232,241,226,190,
+141,80,30,6,0,1,2,6,11,18,30,55,88,124,165,200,209,208,208,208,210,210,207,202,195,172,147,127,92,66,61,61,63,67,78,94,123,150,179,210,228,234,237,240,240,238,232,228,
+225,225,234,241,243,235,227,225,209,189,186,190,198,206,214,220,224,225,223,221,216,209,202,196,193,190,190,189,190,188,187,187,186,185,184,181,181,182,188,196,210,233,248,243,221,191,158,131,
+112,97,83,70,58,47,38,30,24,19,15,12,10,10,9,9,13,23,42,67,96,113,116,116,115,105,96,91,85,77,64,53,42,33,26,20,16,13,11,11,14,21,33,50,69,84,92,93,
+92,91,94,99,106,112,104,85,73,76,82,77,56,40,37,37,41,46,55,66,78,89,102,115,125,130,138,145,147,144,136,130,38,33,28,25,25,25,25,25,28,35,47,61,77,95,116,143,
+162,174,183,193,204,210,209,207,207,205,205,204,204,205,204,205,205,205,205,205,205,206,206,205,205,206,206,199,179,140,94,56,35,21,9,2,3,7,21,54,118,183,212,231,229,207,196,194,
+166,119,93,101,120,151,189,211,217,227,240,228,188,149,120,100,84,73,67,62,58,58,59,63,69,81,115,173,215,233,238,226,216,219,223,226,230,233,236,237,243,251,252,248,235,220,216,216,
+216,220,225,234,246,250,247,238,239,241,239,237,235,238,245,249,252,253,252,244,231,193,148,124,113,115,133,153,171,186,199,212,221,225,228,228,229,227,222,214,206,196,188,183,181,179,178,177,
+176,174,175,182,199,217,232,242,247,239,212,178,151,134,121,111,99,88,75,63,52,41,33,26,21,16,13,10,8,8,7,7,7,6,7,10,21,41,60,74,79,73,69,70,77,85,90,91,
+89,82,75,68,63,62,62,65,72,80,87,91,87,75,61,57,66,86,108,127,143,155,158,155,152,152,154,152,141,127,124,123,126,130,135,141,143,144,143,138,132,126,117,102,86,68,51,43,
+0,0,0,0,0,0,0,0,4,20,47,73,87,92,95,99,104,110,119,128,140,153,162,170,172,165,149,128,108,94,84,82,82,82,82,81,81,82,82,81,81,82,81,73,55,30,13,4,
+3,2,4,7,9,9,8,7,16,39,66,107,148,181,207,213,220,232,227,226,226,224,214,196,190,176,132,72,33,23,32,44,58,70,77,83,84,84,85,94,117,156,214,239,216,190,161,135,
+132,140,146,149,153,156,159,159,160,175,192,206,223,229,229,228,228,226,219,208,185,158,135,111,105,106,99,88,79,85,104,123,145,178,197,201,215,231,220,195,175,152,151,164,175,182,188,195,
+200,205,209,212,216,219,221,223,221,214,204,194,184,177,177,181,186,191,205,227,243,246,238,224,206,181,158,147,141,134,126,118,109,98,84,71,59,48,40,34,30,26,24,22,20,18,14,12,
+11,9,8,8,7,8,11,16,19,17,15,17,22,32,43,54,65,77,83,88,90,90,90,87,82,75,65,50,37,31,38,58,91,124,143,151,151,144,136,129,120,118,127,133,133,131,131,131,
+129,126,118,109,97,89,82,74,66,59,49,34,19,8,1,0,12,12,12,12,12,13,20,38,65,87,93,84,65,50,41,35,29,27,28,31,39,51,66,87,117,145,155,144,124,93,63,47,
+39,32,29,29,29,29,29,29,29,30,33,38,39,41,48,56,60,63,68,77,82,82,82,82,80,79,78,80,87,97,104,104,116,144,149,147,136,110,72,41,30,21,4,0,0,0,0,0,
+3,8,13,21,34,61,108,166,211,231,222,173,132,127,132,137,140,139,137,136,136,136,132,123,110,100,99,102,112,119,123,123,119,114,104,91,75,67,71,74,73,72,69,60,48,39,34,27,
+26,44,59,66,90,143,197,226,244,244,236,229,222,207,192,181,176,179,181,183,188,194,197,205,217,227,233,232,227,223,228,236,240,244,249,252,246,236,225,216,211,207,206,207,206,203,202,201,
+198,191,180,165,148,131,115,103,95,92,89,88,87,84,74,68,65,58,53,57,53,38,22,11,7,6,7,7,6,7,8,10,14,19,24,30,34,35,35,33,30,29,31,37,51,76,106,133,
+147,141,122,101,83,66,48,36,28,30,41,53,62,73,84,87,86,82,74,67,61,62,69,75,76,75,72,64,52,42,34,23,71,71,73,77,85,93,103,116,122,103,63,27,9,2,0,0,
+0,0,0,0,0,0,11,34,67,107,144,157,158,154,141,127,117,109,104,103,103,103,103,102,102,105,111,118,122,128,137,143,135,123,117,115,113,112,112,112,113,114,115,115,114,114,115,115,
+115,118,124,132,129,112,84,55,34,22,14,7,3,1,0,0,6,20,35,63,119,182,224,232,216,191,165,151,155,158,150,136,118,101,92,90,98,111,124,131,133,128,122,117,114,112,106,100,
+96,92,89,86,86,87,84,77,74,74,76,81,86,88,88,82,73,73,77,83,95,113,140,166,192,208,216,225,232,241,241,233,225,224,225,226,227,230,231,236,244,251,255,255,255,255,255,255,
+255,255,254,253,252,252,251,252,253,253,253,254,254,255,255,255,255,255,253,248,239,227,212,191,170,154,144,137,133,130,128,124,122,122,128,137,135,120,94,65,46,35,25,18,14,12,11,11,
+10,10,10,10,9,12,22,37,55,76,97,116,132,145,146,134,110,82,58,46,38,32,28,29,35,49,63,77,90,99,104,105,105,104,103,102,100,97,91,81,71,68,71,78,85,87,87,82,
+98,104,115,128,141,139,126,103,69,32,5,0,0,0,0,0,0,0,0,2,12,33,56,75,85,92,97,100,104,115,126,132,141,148,149,148,148,147,150,157,169,180,184,184,183,185,188,186,
+171,149,132,123,120,117,105,88,70,55,47,42,42,46,55,61,66,78,97,112,122,137,143,136,124,111,96,84,79,79,84,103,139,177,201,220,238,231,205,181,171,174,179,181,173,147,110,68,
+35,17,9,9,14,29,63,108,147,167,166,153,133,109,90,80,76,72,68,66,62,52,36,22,19,20,27,40,57,69,79,91,100,107,119,135,150,153,143,129,110,98,101,114,132,163,193,216,
+226,226,226,226,227,230,233,234,236,241,244,242,238,243,246,240,235,234,234,233,234,233,233,233,233,232,229,228,226,225,224,222,214,208,214,225,237,245,247,242,230,214,200,190,182,171,161,144,
+125,119,128,136,141,149,152,143,130,116,101,86,76,69,66,66,66,65,66,66,66,75,94,118,137,151,160,167,174,167,148,132,132,138,146,152,154,157,162,168,177,185,189,190,188,184,180,180,
+180,180,181,181,177,166,152,140,122,93,70,62,65,70,77,90,156,164,171,174,168,153,132,106,71,43,30,26,26,26,34,56,79,96,109,121,136,150,154,149,138,127,118,112,112,122,141,163,
+183,192,189,186,187,193,202,217,231,240,240,236,233,233,233,232,229,225,221,218,216,216,212,198,175,147,116,80,53,40,35,37,40,49,61,72,86,115,152,175,185,191,194,201,212,222,230,242,
+251,246,235,222,199,176,162,156,156,161,170,174,160,116,56,11,0,0,0,0,0,0,15,64,122,154,155,136,113,98,94,94,91,87,84,80,74,62,48,41,41,46,57,72,86,93,98,105,
+117,131,141,140,125,97,74,59,50,50,59,69,79,90,103,120,132,140,150,161,171,177,175,166,157,154,160,159,150,157,162,152,146,147,146,146,146,144,142,141,139,136,130,123,117,113,110,102,
+88,77,82,95,119,146,175,205,227,238,241,243,244,241,236,225,206,188,179,173,167,166,170,172,169,167,165,161,157,154,152,152,152,153,152,152,153,159,167,170,171,175,185,202,220,227,226,227,
+235,241,245,246,248,250,251,252,251,249,246,245,243,244,246,248,248,249,249,248,248,245,243,245,245,239,225,207,187,167,156,152,238,238,239,239,236,232,229,223,214,202,192,185,183,185,196,216,
+231,238,243,245,245,242,238,234,231,230,228,226,225,223,220,213,206,203,202,203,206,208,209,211,212,204,173,136,120,119,118,118,117,118,133,162,173,167,167,182,200,211,220,220,213,204,195,193,
+194,197,201,208,213,222,231,237,239,240,240,240,232,219,209,191,165,141,127,121,116,114,106,94,91,102,123,141,139,102,41,2,0,0,0,0,0,1,5,35,89,129,143,139,133,131,124,108,
+93,85,81,80,83,87,89,88,87,88,86,85,88,92,96,104,121,135,142,131,103,74,56,49,49,54,63,71,82,94,105,117,131,149,166,176,175,164,146,133,122,112,104,95,87,83,81,76,
+74,74,72,70,70,68,66,64,62,59,56,52,47,42,38,33,28,24,21,21,23,30,45,71,101,127,148,161,170,184,201,221,236,242,244,243,241,237,233,227,218,212,209,207,208,209,207,206,
+206,206,207,208,211,218,221,220,219,223,228,238,243,243,242,239,228,216,208,203,202,199,191,184,179,176,178,187,196,202,203,199,195,194,194,195,199,207,215,223,227,227,228,233,239,242,239,237,
+151,160,163,164,165,168,175,182,190,198,209,218,223,229,229,218,208,204,203,202,197,190,186,185,185,183,178,170,159,148,131,105,80,66,61,58,56,55,54,54,55,51,32,15,12,16,24,33,
+42,48,52,65,76,76,72,79,99,114,134,162,189,219,237,239,236,234,232,228,223,227,236,239,243,243,240,233,209,165,119,82,53,42,42,47,57,66,66,66,75,89,106,125,130,110,66,21,
+1,0,0,0,0,0,16,60,113,150,164,162,149,122,87,56,37,28,22,21,24,33,41,44,44,40,32,23,20,21,24,30,43,54,69,85,94,97,97,96,95,98,103,109,119,138,153,165,
+174,183,187,186,178,168,159,156,153,148,139,125,110,99,90,81,71,64,59,55,51,47,45,44,43,42,39,36,35,37,40,46,52,56,55,53,50,48,47,48,52,57,62,61,54,55,69,96,
+125,149,164,174,185,199,211,223,234,239,241,242,243,243,243,243,243,243,244,243,239,225,208,204,204,209,209,199,184,165,145,129,114,103,94,85,79,70,62,62,69,81,98,111,110,96,75,56,
+49,48,48,48,56,70,85,94,92,86,89,100,118,127,127,135,10,16,20,25,33,44,59,73,83,87,91,95,102,114,120,112,102,98,97,95,93,92,91,93,95,104,114,122,124,122,120,113,
+101,91,83,73,63,55,51,50,49,49,50,54,61,78,95,108,116,120,120,119,118,118,117,116,116,116,117,117,107,114,138,142,130,123,120,112,102,106,127,142,156,179,200,211,226,233,222,201,
+164,128,98,82,87,96,95,100,110,120,129,138,144,138,119,89,58,36,27,26,35,57,94,134,162,170,161,137,103,68,42,25,16,10,5,2,0,0,0,0,0,0,0,0,0,0,0,0,
+0,2,8,20,36,51,66,81,90,95,98,101,108,123,134,136,133,132,131,130,128,126,125,125,126,131,139,144,145,141,138,131,122,112,104,95,85,77,72,70,67,67,65,64,70,84,100,111,
+119,122,122,121,120,119,119,117,116,115,114,106,85,66,61,64,71,78,83,87,91,97,110,130,153,169,179,188,191,193,197,199,201,202,202,198,187,166,150,148,145,142,134,123,109,89,69,63,
+66,68,70,75,77,78,81,84,85,89,83,64,40,18,3,0,0,0,0,0,0,0,2,3,0,0,1,2,4,3,3,5,0,0,0,0,0,0,2,8,12,13,12,12,13,19,23,21,
+17,16,17,18,20,21,23,24,26,34,47,64,81,94,103,112,122,128,130,131,130,129,128,127,127,127,128,128,131,133,130,122,112,106,103,102,102,101,100,100,99,98,100,102,95,88,87,88,
+85,83,83,84,84,84,86,87,87,91,101,107,125,156,189,218,241,242,219,179,144,121,98,83,81,94,110,123,135,143,146,143,136,125,119,121,130,147,164,171,163,141,111,79,54,38,26,19,
+12,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,4,8,14,21,27,33,38,41,45,53,57,58,55,55,56,56,56,56,54,53,53,58,67,80,94,103,110,118,
+126,131,133,134,133,130,128,128,126,126,125,126,128,129,124,115,104,96,94,92,92,92,92,91,90,91,96,98,93,89,87,88,87,87,86,88,89,90,91,94,96,98,102,105,107,108,110,111,
+106,103,103,102,101,93,83,79,78,79,81,83,88,90,94,104,110,111,117,128,140,146,144,123,98,78,48,18,3,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,5,7,10,11,13,14,16,18,20,24,30,35,40,49,60,69,77,87,96,103,108,109,110,110,111,110,106,93,76,63,
+54,49,46,45,44,43,42,40,38,36,37,37,39,41,42,40,39,38,36,38,43,46,46,41,34,29,27,26,27,29,39,61,102,149,200,230,228,215,196,153,90,58,52,58,72,88,104,117,
+124,128,131,134,138,143,148,149,143,126,104,81,53,28,14,9,6,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,9,15,14,10,12,17,19,22,24,
+25,26,27,27,27,26,25,25,24,23,24,26,28,32,34,42,51,59,66,76,85,92,96,97,97,97,96,95,90,73,54,38,27,22,19,18,18,18,17,17,16,17,20,24,26,30,32,33,
+33,32,33,36,42,47,47,43,36,33,33,33,33,33,34,32,27,23,21,21,22,18,15,14,15,18,21,24,31,40,52,63,66,63,66,75,86,99,107,110,100,78,58,41,26,12,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,5,7,10,13,14,14,14,14,14,13,10,6,5,4,5,6,8,10,13,15,17,21,24,27,29,31,31,32,34,35,
+36,38,40,43,47,51,53,54,56,57,57,58,56,52,48,47,47,46,46,45,44,42,41,38,35,34,31,28,26,24,22,20,17,15,13,11,10,10,8,7,4,3,2,1,0,0,0,0,
+0,10,44,93,135,167,198,226,218,182,144,103,74,68,62,59,62,66,70,73,74,75,77,82,93,104,113,117,109,79,46,23,11,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,4,13,22,33,51,68,84,95,95,75,61,51,46,45,46,47,46,46,46,45,45,45,40,32,23,16,12,9,8,8,8,9,10,11,13,17,20,20,22,21,21,21,20,17,11,5,3,
+2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,2,3,4,5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5,5,6,6,6,6,6,6,5,7,9,
+10,9,9,11,15,21,30,49,72,84,87,86,85,77,54,27,9,3,1,0,0,0,0,0,0,0,0,0,0,1,1,1,77,81,87,96,105,110,111,111,111,111,111,108,99,85,77,71,
+61,50,40,32,28,30,32,33,34,35,35,37,41,46,49,50,52,53,53,53,55,56,57,57,59,60,61,64,66,67,68,69,69,69,69,68,64,61,58,55,51,48,45,42,38,35,33,30,
+27,23,22,25,32,46,58,63,64,63,61,60,58,55,58,62,61,58,57,59,66,77,96,138,189,222,237,232,215,202,175,137,96,66,56,46,38,31,25,20,19,22,30,48,77,97,98,88,
+77,65,57,48,41,37,37,39,43,50,56,65,76,83,84,87,104,123,138,148,156,164,180,196,205,215,220,217,212,207,203,200,197,194,190,187,186,185,186,180,162,139,112,80,55,44,32,17,
+7,2,0,0,1,1,0,0,0,0,1,1,1,2,2,2,2,2,1,1,0,0,1,1,1,2,2,2,3,2,2,2,2,2,3,8,19,36,51,58,60,61,61,61,60,58,61,65,
+65,66,66,66,67,66,66,66,66,67,66,62,56,49,42,31,19,10,5,4,5,5,5,6,11,18,30,49,73,94,103,99,83,70,62,53,45,40,40,40,40,40,44,52,62,67,69,69,
+72,68,65,59,54,52,51,50,48,46,49,56,70,97,137,163,163,158,153,151,155,161,157,142,124,107,97,102,112,118,120,121,123,123,123,124,127,128,132,136,139,141,146,149,150,152,153,153,
+154,154,153,151,147,139,128,117,106,93,84,80,74,67,58,53,52,60,70,83,96,105,103,99,96,95,94,93,94,103,120,126,124,122,122,122,120,119,117,118,127,144,167,197,219,229,241,244,
+230,206,188,164,143,119,90,65,47,35,29,29,38,54,67,77,87,96,100,103,103,108,126,147,172,193,200,205,209,210,209,211,223,231,235,234,233,232,228,222,215,209,205,207,209,212,215,218,
+222,223,224,223,220,215,212,211,218,225,227,221,207,198,179,147,111,70,43,24,9,6,9,16,22,27,35,40,41,42,41,42,43,43,42,39,32,19,9,4,1,1,2,2,3,4,6,11,
+18,30,46,63,80,90,92,89,88,88,89,89,91,102,120,126,125,124,124,124,125,125,124,125,125,124,124,124,122,120,117,106,88,64,38,17,6,4,5,6,6,5,2,3,12,29,43,56,
+72,81,86,89,89,88,88,88,88,88,88,86,81,78,76,76,52,53,52,49,45,44,43,42,47,67,87,108,137,175,214,231,233,235,237,239,235,237,242,242,238,233,229,230,231,229,229,230,
+231,231,230,230,232,234,236,238,239,239,241,242,242,241,242,243,243,243,242,242,241,238,234,227,217,205,197,193,190,181,165,148,140,144,153,154,140,112,85,66,56,51,46,45,45,58,77,80,
+76,74,74,73,73,72,71,70,68,67,69,80,95,108,132,168,206,225,231,233,232,230,224,213,198,188,183,182,181,181,182,184,187,190,194,197,200,208,226,235,231,221,214,210,205,206,209,208,
+196,176,163,156,150,143,124,102,85,69,57,51,47,50,54,61,71,81,92,103,113,117,117,118,124,132,147,171,187,199,214,230,234,222,204,177,146,124,111,98,87,83,82,84,85,86,87,90,
+92,90,88,88,87,78,65,55,49,47,48,49,52,58,64,76,92,112,131,136,121,92,63,45,38,34,33,33,36,51,71,76,72,71,72,71,70,69,69,69,69,69,70,74,81,88,97,109,
+119,121,108,79,47,23,10,4,3,4,5,4,3,3,4,8,14,22,29,36,43,45,44,44,44,45,44,39,34,38,45,51,107,108,109,112,119,126,139,162,193,221,230,229,223,205,170,151,
+152,156,161,163,157,166,190,214,229,238,244,249,252,251,252,251,251,249,248,247,246,246,245,244,243,243,243,243,242,243,244,243,243,243,243,243,245,247,250,253,254,254,254,254,254,253,248,238,
+224,211,195,172,148,124,106,90,75,58,43,32,23,22,23,23,21,20,19,17,18,16,15,14,14,12,12,11,13,15,21,38,67,99,129,153,161,165,174,184,194,199,200,199,198,198,199,198,
+198,197,197,195,197,193,166,132,103,85,85,92,103,116,126,130,125,119,115,114,113,112,110,107,101,92,78,61,47,41,39,40,42,46,52,61,73,88,106,131,145,144,139,134,130,134,147,165,
+187,207,218,232,241,243,235,216,183,139,97,76,60,48,42,42,45,45,45,51,67,92,116,131,131,122,115,114,118,120,115,112,112,116,122,123,112,95,78,63,48,33,19,9,3,3,6,7,
+7,7,9,11,18,27,33,36,36,36,36,38,41,45,51,62,85,111,128,137,130,111,88,67,45,22,8,3,2,0,1,1,0,1,1,1,2,3,5,10,17,26,38,52,67,85,97,104,
+109,116,130,163,198,214,228,241,234,212,189,171,153,134,121,121,123,127,131,135,140,146,156,166,173,175,175,183,196,207,211,210,204,196,186,181,178,175,172,172,173,174,177,179,180,183,185,186,
+188,191,195,200,205,211,217,223,225,225,226,225,226,231,240,247,249,246,236,213,186,159,136,124,120,114,103,87,69,52,38,28,24,23,21,19,18,16,16,14,13,12,12,11,9,7,4,3,
+4,13,35,65,94,114,122,123,120,109,93,80,68,59,54,52,52,52,55,62,72,78,73,73,81,93,104,112,115,111,102,95,89,85,84,84,84,84,85,89,98,107,115,117,116,114,112,113,
+113,113,113,114,115,119,126,136,140,134,125,116,111,106,103,101,103,101,91,95,112,136,162,197,224,227,211,193,166,126,80,40,19,14,22,39,60,87,113,129,125,108,95,91,92,87,75,61,
+48,38,36,41,52,65,77,85,88,84,74,60,46,37,38,46,61,81,93,103,134,164,178,182,182,182,181,181,181,181,180,181,194,201,199,209,219,222,222,215,196,154,111,74,46,26,16,13,
+13,14,17,25,35,44,54,68,80,93,104,112,115,111,105,103,186,202,218,237,243,236,215,168,111,67,54,63,76,87,93,97,101,105,110,114,120,124,125,122,117,114,112,112,118,126,133,136,
+134,128,122,121,121,123,125,128,131,136,141,145,151,155,161,168,176,184,191,195,195,194,193,194,195,193,190,187,186,188,197,207,217,229,243,249,244,227,192,151,128,123,126,130,129,121,105,84,
+66,54,48,45,43,42,40,40,45,51,56,57,56,53,47,38,28,17,11,15,27,47,70,91,108,118,118,113,105,94,85,81,81,82,87,96,106,112,118,119,115,106,93,79,65,48,35,29,
+27,30,34,37,38,38,38,41,47,57,71,86,99,104,103,98,93,90,88,87,85,84,81,71,59,47,38,34,33,31,27,25,24,18,9,2,0,3,14,37,77,128,169,189,211,227,222,197,
+167,145,127,121,118,113,106,102,100,91,87,90,97,97,94,86,74,60,46,34,23,19,24,37,57,82,110,132,152,171,187,199,212,223,229,231,231,219,209,207,209,213,214,215,215,215,213,211,
+217,215,203,199,200,205,210,220,238,249,243,222,192,157,127,107,99,101,105,114,124,129,133,133,132,135,133,128,122,125,138,155,252,250,247,243,238,235,226,202,171,135,95,67,50,36,30,29,
+34,43,52,61,70,80,91,101,111,119,122,125,128,130,133,134,137,136,134,131,132,135,137,142,146,152,157,166,175,182,191,198,204,206,206,202,200,201,202,201,197,191,186,184,180,177,175,176,
+180,189,206,223,237,247,248,231,205,181,165,156,157,163,167,160,143,124,112,108,105,103,102,102,106,109,108,107,105,104,102,97,90,78,62,45,32,29,31,36,45,63,82,95,106,115,119,120,
+119,118,115,108,97,84,73,60,47,42,45,56,73,89,98,105,116,130,145,151,152,152,152,152,152,153,154,156,159,160,155,142,123,104,92,75,54,39,35,36,39,42,42,42,41,41,41,41,
+40,35,26,16,12,11,11,10,11,19,36,56,87,128,174,213,233,240,236,225,217,212,203,189,173,159,155,168,185,189,189,186,182,176,166,145,118,99,96,106,126,151,183,212,234,243,240,229,
+211,189,174,167,150,122,109,108,112,116,116,116,117,117,116,115,116,109,91,77,67,65,66,71,99,141,180,215,236,244,239,227,218,217,218,220,219,217,214,208,208,216,222,226,229,237,247,251,
+141,125,117,114,113,121,149,181,207,224,227,215,193,160,133,102,80,77,78,81,91,107,122,136,145,150,154,157,159,162,163,165,167,169,169,167,167,170,172,176,180,184,190,196,202,207,211,213,
+213,213,212,212,214,213,208,200,190,184,180,176,172,167,164,161,160,163,170,180,193,214,237,250,253,248,237,218,198,182,173,168,158,140,125,121,119,118,116,113,105,93,85,80,76,74,77,82,
+90,97,101,99,92,88,83,64,46,39,39,44,51,57,62,63,61,57,47,36,32,36,44,54,75,112,152,185,208,224,230,234,237,241,244,244,243,243,243,243,243,242,242,242,242,242,242,240,
+233,225,218,205,178,152,137,127,116,107,103,102,102,102,103,103,103,103,99,93,90,89,89,89,90,89,91,98,105,116,138,168,196,221,239,248,253,255,255,252,248,243,241,245,249,250,250,249,
+249,248,246,240,232,230,229,229,227,223,215,200,175,152,138,130,118,98,81,76,75,75,74,73,66,56,49,46,46,47,52,61,70,80,87,87,82,79,74,56,38,36,46,68,102,147,191,224,
+242,251,255,252,249,248,248,248,248,250,250,244,223,206,186,165,8,7,10,12,13,16,36,66,94,126,162,190,217,235,242,239,226,212,188,159,147,145,137,130,127,127,131,134,137,140,142,144,
+147,152,160,167,170,173,178,183,189,195,199,200,204,210,215,217,219,220,220,218,214,209,203,197,193,191,188,184,180,176,172,168,164,161,159,157,159,168,184,205,223,237,247,250,244,231,214,197,
+179,151,129,115,106,97,91,84,76,69,63,59,55,51,46,45,47,53,64,75,84,90,92,81,68,63,62,60,59,59,61,66,71,70,64,78,108,143,172,191,212,233,244,243,235,223,214,210,
+203,193,182,179,178,179,184,190,195,196,196,198,200,201,205,215,227,236,242,249,252,249,242,228,209,188,178,177,177,177,177,177,177,180,185,187,189,189,189,191,193,193,192,193,195,203,218,232,
+242,246,248,246,241,232,228,228,230,232,232,228,219,216,217,219,220,221,221,205,176,156,142,123,107,90,72,55,46,45,46,49,48,41,35,32,31,27,23,19,12,9,6,6,6,6,8,11,
+17,28,42,58,71,78,80,69,54,51,56,75,109,157,202,230,241,227,189,148,126,123,124,125,124,126,125,101,61,40,26,14,30,37,43,46,46,50,66,82,85,83,87,94,105,123,145,177,
+202,222,239,236,225,211,176,138,116,107,104,107,111,115,118,121,124,127,132,137,142,146,155,170,182,188,193,197,201,206,210,214,216,216,214,212,209,208,206,205,203,200,198,195,192,189,186,183,
+179,175,171,166,162,162,167,174,181,192,209,226,240,248,251,250,244,229,212,193,169,146,129,116,102,90,82,77,71,66,60,54,48,44,41,40,42,43,46,48,52,64,76,85,97,116,136,157,
+176,187,197,214,232,243,245,243,236,217,182,144,113,90,83,85,90,86,80,78,79,82,95,110,112,109,108,107,104,101,103,109,115,121,128,149,180,203,219,232,241,243,243,243,243,243,243,243,
+243,243,244,244,245,245,245,247,249,249,249,248,248,248,244,234,217,196,175,155,130,106,99,99,101,101,97,83,68,62,62,65,64,66,64,48,22,18,32,41,43,42,41,42,46,49,50,51,
+51,50,50,49,46,41,33,21,8,3,3,4,5,5,5,5,4,4,5,8,11,17,29,46,65,103,158,206,232,235,213,180,148,93,35,10,3,3,3,3,2,2,0,0,0,0,1,12,
+52,41,33,30,31,34,41,43,36,31,29,28,25,24,30,43,58,82,130,175,199,222,237,228,210,187,157,138,125,115,113,116,119,121,124,127,131,135,145,161,171,176,182,188,194,197,202,206,
+209,211,212,213,213,213,212,210,209,207,205,203,201,198,195,193,191,188,185,181,177,178,182,182,178,176,178,183,193,206,219,229,242,250,252,249,240,225,213,205,190,167,142,124,112,103,97,92,
+87,81,77,74,74,77,91,113,133,153,171,184,198,217,231,240,245,246,243,234,218,191,161,139,117,84,47,24,20,33,46,53,52,46,39,36,35,36,43,45,38,33,31,29,24,21,20,20,
+18,15,16,25,43,65,88,115,145,168,174,174,173,173,173,173,173,173,172,172,173,172,175,182,184,183,182,179,171,160,137,106,76,53,37,26,17,11,9,8,9,8,6,3,0,0,0,0,
+0,0,0,0,0,8,33,44,43,44,44,43,39,35,34,35,35,36,36,37,42,47,53,54,42,22,8,4,4,5,5,5,4,2,1,7,33,80,135,178,205,225,230,200,150,101,55,27,
+19,21,27,27,28,28,28,28,28,29,26,27,33,49,61,61,132,89,60,33,12,0,0,0,0,0,0,4,9,17,26,35,44,53,66,87,109,140,179,211,232,243,241,231,213,179,152,138,
+132,130,132,135,138,142,146,152,155,161,169,178,186,193,200,205,209,212,215,218,220,220,220,219,218,217,215,214,211,208,204,202,199,196,193,192,190,188,187,184,180,178,175,172,169,170,174,180,
+193,210,224,236,246,251,252,251,250,244,232,218,203,196,192,190,187,184,184,186,188,195,212,228,238,244,246,245,243,238,226,207,188,167,145,121,91,62,38,25,18,13,15,26,45,55,45,31,
+17,12,7,7,7,7,7,5,4,3,4,6,9,14,19,25,29,29,32,38,45,54,62,68,76,81,79,73,68,65,63,62,63,64,63,63,63,61,60,57,49,43,42,39,35,29,19,10,
+4,2,2,2,2,3,2,3,3,2,2,3,2,3,2,2,2,2,2,2,2,3,8,9,7,7,7,6,5,4,3,3,3,4,4,4,6,11,20,36,52,54,42,24,8,2,1,1,
+9,24,52,112,183,223,228,209,180,149,98,45,13,1,13,61,115,160,182,184,183,183,183,183,183,183,183,187,193,199,194,175,231,225,215,188,146,92,49,29,23,22,28,43,60,78,94,107,
+117,123,128,137,147,156,164,172,184,200,216,229,243,246,236,222,207,194,187,184,184,186,186,182,178,179,186,194,201,207,211,215,221,228,236,241,244,244,244,244,244,244,243,243,241,237,232,225,
+218,213,207,202,199,196,194,192,190,188,186,183,181,179,178,176,177,179,184,193,207,220,226,229,235,244,250,252,252,250,249,249,248,248,248,248,248,247,244,236,225,213,199,186,172,150,124,99,
+80,63,48,37,28,24,24,26,33,43,52,58,52,31,12,5,4,5,5,6,5,5,6,8,14,23,34,47,63,78,90,102,108,109,112,117,123,128,129,128,126,122,116,111,106,102,100,100,
+102,103,105,106,107,106,100,80,57,44,40,39,40,39,33,26,20,15,9,6,6,7,5,4,2,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,
+1,1,1,1,1,1,1,3,14,33,47,50,38,27,44,79,126,172,206,232,218,170,116,78,54,39,27,23,35,72,145,214,233,218,204,200,201,202,204,206,209,212,214,215,210,204,203,214,
+101,131,165,201,226,228,208,190,177,151,139,143,152,160,166,170,172,174,178,184,195,202,202,202,202,203,206,211,222,236,247,253,254,252,248,246,244,244,243,242,240,239,240,242,244,245,245,246,
+250,252,252,251,250,250,250,250,249,249,249,248,249,251,252,251,249,246,241,231,221,214,208,204,200,199,197,195,194,192,191,190,188,187,186,185,186,188,189,190,193,201,210,220,226,228,228,227,
+227,225,223,220,217,211,199,181,168,157,148,141,132,115,97,88,83,77,69,62,59,61,63,64,63,57,46,33,19,8,7,6,6,6,7,10,17,25,36,52,74,97,115,130,143,150,153,155,
+155,153,150,148,145,142,139,135,133,133,132,133,133,135,138,140,144,147,150,152,155,156,156,152,141,131,129,129,130,126,118,109,102,97,89,83,81,81,79,73,66,65,64,64,62,62,64,64,
+63,59,49,32,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,13,28,51,81,115,155,200,230,239,231,211,174,126,94,81,79,81,90,109,140,186,226,239,203,
+143,97,77,72,73,76,81,84,84,80,71,61,50,41,42,60,6,21,46,85,138,191,223,236,245,249,244,237,232,231,231,231,233,234,237,241,245,246,245,245,245,246,246,246,246,247,249,250,
+252,254,254,252,247,243,242,243,244,246,247,248,250,250,252,251,250,247,244,242,241,241,241,240,240,239,239,238,239,241,243,246,248,251,252,253,251,247,242,236,231,225,221,218,216,212,207,203,
+200,200,199,199,196,195,193,191,188,186,184,187,193,201,206,206,203,195,185,174,164,154,142,135,130,128,126,127,128,119,106,99,95,92,89,84,78,70,60,50,37,25,16,10,8,7,8,8,
+14,24,38,57,81,102,119,135,150,159,162,162,162,159,155,150,145,139,134,127,117,108,100,96,95,98,102,106,111,115,120,124,127,130,133,136,142,149,154,156,156,155,155,156,159,167,177,191,
+206,220,226,224,223,223,223,221,217,217,217,217,216,217,217,217,216,215,207,187,144,103,80,66,63,63,65,66,61,49,39,35,35,38,39,39,42,50,79,123,153,177,194,211,229,242,234,208,
+178,144,114,91,77,74,84,103,137,180,218,240,238,198,134,75,48,45,48,50,49,43,37,30,22,12,4,0,0,0,0,0,65,88,111,129,144,155,166,173,187,206,215,223,224,220,217,213,
+207,204,199,189,165,151,150,152,154,157,160,162,165,167,169,169,171,173,171,164,156,160,169,174,175,179,186,194,201,208,216,221,225,230,233,235,236,237,238,237,236,235,235,235,236,237,238,239,
+240,241,243,245,247,250,252,253,254,253,251,249,247,244,239,231,225,220,219,217,216,215,214,212,210,208,206,205,205,203,198,190,181,167,153,141,131,121,114,111,107,105,102,101,101,96,89,84,
+77,71,66,61,53,43,33,25,20,16,13,11,12,18,27,40,64,91,118,139,153,161,163,165,164,159,153,143,130,114,101,88,78,72,66,58,50,42,35,33,33,36,41,46,51,54,57,57,
+62,71,83,91,98,113,129,130,128,135,153,167,183,212,232,243,245,239,234,233,234,234,235,234,231,229,229,229,230,234,236,238,240,241,242,246,250,243,230,218,215,216,217,218,214,208,200,197,
+200,202,203,203,207,214,230,240,232,222,210,200,187,159,121,88,71,59,53,60,88,134,179,208,227,226,193,147,94,42,15,9,11,12,16,17,17,13,7,4,3,2,2,2,3,9,19,31,
+144,154,158,159,158,153,146,135,118,98,85,79,73,66,60,56,53,52,51,46,40,39,42,46,50,53,55,57,59,62,63,64,66,67,69,70,75,84,96,104,110,118,130,142,153,165,175,186,
+195,203,211,215,218,220,222,221,220,219,219,219,220,222,225,228,230,230,230,229,229,231,233,236,240,243,247,249,250,251,253,253,251,247,244,240,235,231,229,227,226,224,220,215,207,196,185,176,
+165,157,147,140,134,129,125,121,118,113,110,106,103,98,93,87,80,73,64,55,48,39,32,26,22,19,20,28,48,75,98,118,138,155,163,164,164,160,154,143,127,103,83,66,49,37,30,26,
+23,23,22,21,21,21,25,31,35,37,37,37,38,46,67,99,134,163,181,187,190,192,197,202,209,219,228,230,230,215,186,153,122,102,94,96,97,100,102,96,86,82,81,81,83,91,101,113,
+123,128,128,134,156,178,201,216,218,217,217,217,215,214,217,218,217,214,214,213,210,202,183,152,127,111,99,87,71,51,40,45,77,124,165,193,217,229,215,180,135,86,42,15,3,1,3,5,
+5,5,4,4,4,5,3,2,2,3,7,18,39,68,96,117,159,156,148,135,116,92,72,53,34,18,9,3,0,0,0,3,6,9,13,17,21,26,29,32,35,36,36,37,37,38,39,40,
+41,43,45,48,53,57,64,73,83,96,109,121,134,146,157,167,175,183,189,194,198,201,204,205,206,207,207,208,209,210,211,212,214,215,215,215,216,217,216,218,219,220,223,224,226,229,233,237,
+238,237,238,240,242,243,243,242,241,241,238,232,225,218,213,208,204,199,196,194,192,192,186,171,153,136,126,118,113,108,102,95,88,80,70,60,52,44,36,34,38,49,68,95,126,149,158,163,
+163,158,152,141,122,100,81,65,48,35,31,35,43,53,65,77,90,101,106,109,120,136,150,157,158,157,155,156,163,180,204,219,219,214,208,205,205,203,201,196,184,164,141,122,106,73,43,26,
+18,15,16,16,16,17,17,15,11,10,9,8,8,10,13,16,21,22,21,21,23,30,43,54,55,55,55,54,52,51,53,56,55,52,54,54,51,43,33,24,22,29,43,65,102,137,165,190,
+215,233,232,202,159,113,63,30,12,2,1,3,5,6,6,6,6,5,4,4,4,4,5,7,17,33,56,86,120,145,156,159,126,101,73,50,32,17,7,1,0,0,0,0,0,0,0,3,
+6,8,12,14,16,19,22,26,33,45,60,67,67,67,67,68,69,70,71,73,77,81,86,87,83,83,90,102,115,128,141,152,161,170,177,182,187,191,194,196,198,200,202,202,204,204,205,206,
+207,209,210,211,212,212,214,215,215,215,215,216,217,217,218,218,218,219,219,220,222,225,228,230,229,228,229,231,233,233,232,231,229,226,222,216,209,197,179,159,143,134,128,122,118,112,107,99,
+92,84,76,68,63,62,67,80,103,126,146,159,165,165,160,144,118,95,78,64,62,53,43,45,66,99,135,164,183,196,207,215,222,227,229,231,232,230,225,221,219,218,218,217,216,209,191,159,
+123,92,73,65,64,63,62,59,54,45,33,26,23,19,19,20,20,19,18,18,16,16,15,14,14,14,14,13,12,11,10,8,8,7,6,6,5,3,2,1,1,0,0,0,0,0,0,8,
+22,28,24,21,20,27,39,58,96,132,156,168,171,166,156,149,139,116,82,45,19,5,0,0,2,3,4,4,5,4,4,4,5,6,7,10,14,22,36,57,86,114,137,153,160,161,157,149,
+41,23,9,2,0,0,3,10,19,30,43,55,70,94,115,122,124,125,126,127,128,130,132,142,155,172,182,184,184,184,184,184,184,185,185,186,187,188,190,190,185,169,157,151,139,124,123,132,
+144,153,162,169,175,179,183,186,190,192,194,195,197,198,199,201,203,205,206,207,209,210,211,212,214,215,215,216,216,217,217,217,218,218,219,219,219,218,217,216,216,214,212,209,207,204,200,195,
+189,184,177,169,160,151,145,141,138,134,132,129,125,122,120,116,112,110,112,113,117,125,138,152,164,168,168,165,157,135,101,76,80,98,111,138,169,164,152,159,179,201,217,224,223,216,203,187,
+163,143,138,140,139,130,112,98,91,89,88,86,86,83,76,64,52,40,33,31,30,30,30,29,29,28,29,28,28,28,27,26,25,24,24,22,22,21,20,18,18,17,16,16,15,14,14,13,
+12,11,11,10,9,8,8,9,10,16,29,48,70,94,121,151,169,170,166,161,161,169,177,176,157,125,88,56,29,12,4,2,2,1,1,3,5,7,8,8,8,9,9,9,11,16,21,26,
+32,40,53,67,79,97,118,138,153,159,161,159,152,133,103,75,0,0,0,0,6,18,41,74,111,141,158,162,158,152,144,141,141,142,143,144,144,145,144,137,122,99,74,68,69,68,69,69,
+70,71,71,72,74,76,79,89,117,153,172,187,202,203,174,141,127,132,144,152,160,165,170,174,178,181,184,186,188,190,192,194,196,198,200,201,203,204,207,208,210,210,211,213,213,214,215,215,
+216,217,217,218,218,217,217,216,215,213,212,208,204,201,198,195,191,189,187,184,180,176,173,170,167,164,161,159,159,160,164,165,165,167,171,173,174,175,175,174,170,162,145,118,93,91,108,145,
+182,181,172,151,110,92,94,97,96,93,89,87,87,85,78,66,50,42,42,42,44,44,43,40,39,38,39,39,38,38,39,39,40,40,40,40,39,39,38,38,37,36,35,34,33,32,32,31,
+30,29,28,26,25,24,23,22,21,21,19,18,17,16,15,15,15,13,12,11,11,10,13,20,36,63,97,127,142,139,124,96,76,78,88,93,91,78,56,37,14,0,0,0,0,4,14,23,
+32,45,56,63,65,65,65,65,65,66,66,67,72,83,96,106,113,124,136,145,151,157,160,161,159,151,136,112,82,51,27,11,0,0,0,1,2,6,9,15,25,32,36,33,24,13,6,4,
+5,6,7,8,9,10,11,12,12,9,9,9,8,8,8,8,8,8,10,11,12,14,19,24,30,41,54,69,93,138,190,213,188,151,126,132,141,148,155,160,165,169,172,174,177,179,182,185,
+187,190,192,193,195,197,200,201,203,204,205,207,208,209,210,211,211,212,213,213,213,214,214,213,212,210,208,207,209,212,214,216,215,216,215,213,211,209,207,205,203,202,200,198,198,199,199,197,
+194,192,189,185,181,175,165,151,128,97,73,94,145,182,179,151,95,54,42,34,28,27,28,29,31,32,34,35,36,38,40,41,42,44,45,45,46,46,47,48,49,50,49,49,48,48,48,48,
+48,47,47,46,46,45,44,44,43,43,42,42,41,40,39,37,36,35,34,32,31,29,28,26,25,24,22,21,19,19,17,17,16,15,14,13,12,12,12,13,17,22,26,29,28,23,15,5,
+0,0,0,0,0,0,0,0,0,0,1,11,32,62,89,106,119,131,140,143,144,144,144,145,145,145,145,146,148,153,157,159,160,161,161,161,159,156,149,135,111,82,54,31,15,6,3,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,9,13,15,14,13,11,9,9,9,8,8,10,11,12,14,16,21,25,30,35,42,49,58,80,129,
+181,213,173,125,120,127,135,143,148,153,158,161,164,167,170,173,176,179,181,183,185,188,190,192,194,196,197,199,199,201,203,203,204,205,206,207,207,207,207,206,206,207,210,215,222,227,228,227,
+225,223,221,218,216,214,212,210,209,208,206,204,203,201,196,191,185,179,167,154,139,123,102,79,54,55,132,190,155,93,51,33,27,29,32,35,37,39,40,42,43,44,45,46,47,49,49,50,
+51,52,53,53,54,55,56,57,57,57,58,58,57,57,57,57,57,56,56,55,54,55,55,55,57,57,58,60,61,62,60,59,57,55,53,48,45,42,40,38,35,32,29,28,26,24,23,22,
+20,19,19,18,17,17,15,15,13,10,8,7,6,6,5,5,6,5,5,4,3,3,2,1,3,13,34,69,111,141,154,158,160,160,160,160,159,159,159,160,160,160,160,160,160,159,155,152,
+148,144,134,120,107,93,75,53,32,15,6,2,2,3,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,3,3,4,4,5,7,10,10,10,9,8,7,6,
+6,6,5,6,7,9,10,13,16,20,25,31,39,46,53,59,73,127,201,201,173,150,124,122,129,136,141,145,148,151,156,159,162,166,168,170,173,176,178,180,182,184,186,187,189,191,193,193,
+195,196,197,198,198,198,198,201,205,213,222,228,229,229,226,222,217,211,204,197,193,190,187,185,184,182,179,177,172,165,154,141,132,120,104,87,72,58,45,43,85,171,186,94,36,28,31,34,
+37,39,40,42,43,45,46,47,49,51,51,53,54,56,56,58,59,60,61,61,62,63,63,65,66,67,69,70,71,74,77,78,79,79,78,78,78,79,82,86,91,94,101,107,112,113,113,113,
+111,108,102,95,87,80,74,70,64,58,53,50,46,45,44,42,42,40,39,36,35,34,34,33,30,27,23,19,16,13,9,8,7,6,6,4,4,3,4,15,38,74,113,144,157,159,157,151,
+144,135,124,117,115,115,115,115,115,115,115,115,112,104,91,80,71,63,50,37,26,19,12,7,4,2,2,3,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,2,1,1,2,2,3,2,3,4,5,5,5,5,4,5,6,7,8,10,14,18,22,25,26,28,28,29,31,34,40,47,53,58,91,150,183,206,191,131,108,114,121,126,130,134,138,142,
+144,148,151,155,159,160,162,165,168,169,171,173,175,178,178,180,181,182,183,184,186,190,197,208,218,225,227,227,225,218,204,191,181,171,161,153,147,142,138,135,132,129,125,123,118,110,101,92,
+83,75,64,56,62,84,112,155,198,156,64,31,35,39,39,41,42,45,45,47,49,50,52,54,56,57,59,61,62,64,65,66,67,68,70,72,73,74,77,81,85,89,93,99,105,112,120,127,
+132,133,133,136,138,142,147,156,162,168,175,184,187,188,189,188,187,185,179,170,160,152,145,139,130,120,111,105,102,101,99,98,97,96,94,90,86,84,83,81,73,61,46,33,22,15,11,10,
+9,8,6,6,9,20,44,80,119,147,158,160,156,140,108,79,63,51,38,32,30,31,31,31,31,31,31,31,29,24,18,14,10,8,6,5,3,3,4,4,5,4,4,3,3,4,4,3,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,3,3,3,2,2,3,7,12,21,30,42,54,66,77,83,84,81,75,68,59,55,57,
+63,68,71,76,86,115,184,208,163,124,106,108,115,121,123,128,134,143,154,162,166,165,163,164,166,164,160,159,159,162,162,164,166,168,172,177,185,198,211,219,222,222,220,212,198,180,164,152,
+144,137,131,125,120,115,112,109,105,102,98,95,90,85,79,73,71,73,95,133,174,193,186,160,94,44,36,41,43,44,44,46,48,50,52,54,56,58,60,62,64,65,67,69,71,73,74,76,
+79,82,86,90,95,100,107,117,127,136,146,155,164,173,184,194,201,204,207,209,212,216,222,228,233,234,237,240,241,240,239,239,239,238,236,232,227,222,219,215,207,199,192,187,185,183,183,182,
+183,186,187,187,185,183,181,181,177,166,148,124,98,76,58,48,44,42,45,54,72,102,135,160,170,169,164,148,117,75,39,21,13,8,4,3,1,1,1,1,1,2,1,2,2,2,2,3,
+3,3,4,5,4,3,5,5,5,3,3,3,3,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,0,2,
+6,15,27,41,59,76,93,109,122,131,137,139,137,131,123,121,125,128,132,133,131,125,130,172,213,216,179,146,141,144,148,154,165,177,187,194,195,195,195,196,198,198,196,194,194,195,196,197,
+199,203,207,213,222,229,231,226,222,212,197,175,155,142,135,129,125,120,116,111,105,100,97,94,91,87,84,84,88,92,106,137,160,180,197,182,140,89,62,48,40,42,44,45,47,48,49,51,
+54,57,59,61,64,65,68,70,72,75,77,79,82,85,88,94,100,110,119,131,140,150,161,176,190,200,209,217,223,228,234,240,241,243,244,245,246,248,251,252,253,253,253,253,253,253,252,252,
+251,251,251,252,251,250,250,248,246,245,242,241,241,240,241,241,242,244,246,246,246,245,245,246,246,246,244,239,229,214,196,178,164,156,160,170,185,199,202,202,200,193,173,147,118,91,72,63,
+57,48,37,28,21,15,12,11,11,11,11,12,13,11,9,6,5,4,5,4,5,4,4,4,4,4,2,2,2,2,3,3,23,17,14,14,11,6,4,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,4,8,17,29,42,57,72,87,101,116,129,140,149,155,159,161,163,165,167,169,171,172,172,169,166,175,202,229,231,220,216,217,219,
+221,222,223,224,226,229,233,237,242,247,251,250,249,249,249,249,250,251,252,252,253,253,253,251,244,236,229,218,202,191,186,184,180,175,173,171,162,141,117,108,107,113,135,163,185,193,201,189,
+165,140,101,64,48,46,46,46,48,48,48,50,52,54,56,59,61,64,66,69,72,74,77,80,84,89,94,99,104,110,119,131,145,160,176,190,200,208,218,229,237,242,244,246,248,248,249,251,
+251,251,252,252,252,252,253,253,253,253,253,252,252,251,251,251,251,251,251,252,253,253,253,252,252,252,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,254,254,254,254,252,
+247,243,243,243,243,241,239,236,232,226,220,214,206,194,182,173,165,151,132,116,98,80,70,66,66,66,66,68,71,68,53,38,31,29,30,31,31,30,30,30,31,29,23,22,29,30,27,27,
+121,110,99,94,91,81,69,55,36,22,17,15,12,7,2,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,7,11,17,21,24,29,35,42,49,60,74,90,106,123,136,145,150,
+152,153,155,158,161,167,172,173,174,174,181,199,218,228,234,237,240,246,252,255,255,254,251,248,246,243,239,230,225,224,225,225,225,225,226,224,219,210,202,203,210,215,221,223,214,200,189,182,
+174,167,161,161,176,194,199,196,197,198,190,168,140,122,102,74,58,52,48,49,51,51,50,51,51,52,54,57,58,60,63,66,69,72,75,79,83,87,92,100,108,119,131,140,148,159,172,187,
+201,216,228,236,241,243,245,249,250,250,250,250,250,250,249,248,247,246,247,247,246,245,244,241,239,238,236,233,232,233,234,235,235,235,238,241,243,244,246,247,248,250,250,250,250,250,250,250,
+250,249,249,247,246,246,246,247,249,250,252,253,254,253,253,253,253,254,253,254,254,253,251,248,246,246,247,247,248,246,243,240,237,233,224,214,202,186,176,172,173,172,173,176,183,183,166,145,
+136,134,134,135,136,136,135,135,135,132,120,118,140,143,129,126,221,216,207,199,199,201,198,190,178,167,164,158,145,122,98,81,69,57,43,27,13,11,17,18,10,2,0,0,1,3,4,5,
+5,5,4,3,2,2,3,4,6,10,18,26,39,54,65,70,73,75,77,80,89,102,114,124,133,143,158,178,208,231,240,242,243,243,231,204,180,165,153,145,144,145,150,160,167,170,172,172,
+170,166,158,146,132,116,104,101,105,110,113,110,102,92,86,81,77,73,70,70,77,90,101,104,102,94,74,59,53,51,52,52,52,52,52,53,52,52,53,54,55,57,60,62,65,67,71,74,
+78,84,89,97,104,114,125,139,155,171,187,199,206,214,224,233,241,246,249,250,251,251,250,250,248,246,245,243,240,237,234,227,223,219,219,217,216,213,208,202,196,191,185,180,177,178,180,179,
+179,180,182,188,193,199,205,211,217,221,224,225,225,223,219,214,210,208,204,199,197,196,195,198,201,204,209,220,227,231,233,230,225,219,214,212,212,214,214,216,217,221,224,225,226,228,236,242,
+244,245,246,246,245,242,238,238,237,238,238,240,242,244,242,236,234,234,234,234,234,234,233,234,234,232,226,226,238,237,227,223,248,248,246,244,244,245,246,248,249,249,247,243,233,216,201,190,
+181,168,149,121,100,103,125,131,115,95,77,63,48,30,14,3,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,8,8,10,12,16,20,29,44,72,113,162,206,231,234,212,185,165,
+150,136,105,73,59,55,52,54,57,63,71,82,90,95,97,96,94,90,84,77,72,68,68,68,68,67,67,66,65,65,63,61,59,58,56,55,53,49,47,47,47,47,48,49,50,51,51,51,
+52,52,53,53,53,55,56,58,60,63,66,69,72,76,82,88,96,108,122,136,150,163,178,195,210,224,234,240,243,245,248,250,251,251,250,249,247,246,244,240,233,226,221,216,211,204,199,191,
+185,181,179,177,176,172,168,161,155,150,144,138,134,130,129,126,124,123,123,124,127,129,133,137,143,147,149,150,148,144,137,131,127,124,121,118,116,114,109,105,104,102,105,113,123,134,142,142,
+131,116,104,97,94,95,100,108,118,127,133,135,140,151,170,184,192,203,215,227,235,241,244,245,245,245,245,245,246,248,250,248,243,239,237,236,236,235,236,237,239,242,246,248,248,248,247,248,
+247,251,252,251,252,251,250,247,245,242,241,241,237,231,229,228,227,226,219,211,211,222,238,244,243,238,231,221,206,183,152,125,105,92,83,81,87,94,96,96,96,96,96,96,95,95,96,96,
+96,97,98,99,101,109,143,189,222,228,204,165,116,69,46,38,34,32,31,31,34,36,37,38,40,40,41,42,44,44,45,47,51,54,57,60,65,68,69,70,71,67,62,58,54,52,50,48,
+47,46,45,45,44,43,42,43,44,45,46,46,47,48,49,50,51,52,53,55,56,58,60,63,66,70,75,80,87,95,105,118,135,156,176,193,206,217,228,238,244,248,250,251,251,251,251,250,
+248,246,241,235,228,225,219,211,203,195,191,186,181,175,171,167,163,161,159,158,156,153,151,147,144,140,136,132,129,125,122,119,116,113,111,108,105,103,100,98,97,96,95,93,90,86,82,80,
+77,73,72,68,66,63,58,54,49,46,44,43,44,49,53,53,48,42,41,39,40,40,43,48,54,56,52,48,50,59,70,78,88,103,122,144,167,189,199,203,205,205,206,209,214,217,209,190,
+167,150,145,144,146,148,153,160,165,174,185,194,198,210,227,240,154,178,201,213,210,201,192,188,189,191,193,196,199,199,194,187,181,177,181,189,194,192,188,187,188,188,183,178,180,196,214,224,
+228,226,223,223,226,229,230,230,229,230,230,230,230,230,230,229,230,230,230,230,231,231,227,203,155,103,57,29,17,15,16,19,20,21,23,24,24,25,26,27,27,28,28,28,29,31,39,51,
+61,69,73,78,79,80,81,82,82,82,80,74,69,64,56,49,45,40,39,37,37,36,38,38,39,40,42,44,45,46,48,49,51,53,55,58,59,62,65,69,75,83,93,106,122,137,152,170,
+191,211,227,237,243,245,248,250,251,251,250,249,247,246,244,240,233,225,217,208,200,196,191,186,181,178,176,173,171,168,167,165,164,163,162,160,158,156,154,152,149,147,143,141,137,135,131,128,
+125,122,118,114,110,107,102,99,95,92,87,84,80,76,73,69,66,61,58,54,52,49,45,42,39,37,33,31,30,31,35,45,52,57,60,61,60,61,60,60,61,59,56,49,45,40,34,30,
+28,31,38,49,66,83,89,92,94,97,103,108,109,102,86,66,49,41,38,37,39,41,46,51,54,60,69,79,84,93,112,132,22,34,51,60,58,53,52,54,56,56,56,55,54,52,47,43,
+40,39,41,44,45,43,40,39,38,33,26,24,29,47,71,94,110,121,130,133,127,120,117,118,117,118,117,118,118,118,118,117,119,118,119,118,120,115,88,50,21,8,6,8,10,12,13,14,
+15,17,18,18,18,19,19,19,20,22,24,30,39,51,62,69,67,62,57,54,51,50,57,57,51,52,60,67,70,73,74,73,70,64,61,59,59,60,60,49,38,39,41,42,44,47,48,51,
+52,55,58,61,64,69,75,84,96,113,134,157,178,195,209,222,234,243,248,250,251,251,251,249,248,246,240,234,230,226,222,214,206,199,193,187,184,182,181,180,179,178,178,177,177,176,175,175,
+174,173,172,171,168,167,165,163,160,158,155,152,149,146,142,139,135,131,128,124,120,115,112,107,102,98,94,90,85,81,77,72,69,66,62,58,54,51,47,44,42,41,40,43,50,58,67,70,
+66,59,52,46,41,40,44,43,34,35,42,48,52,55,55,52,48,43,40,40,43,44,44,31,17,17,20,21,21,16,12,7,5,5,5,5,5,5,5,6,6,8,10,12,15,16,19,21,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,4,2,2,1,1,1,2,1,1,2,2,2,1,
+2,1,2,2,2,3,2,1,2,4,7,10,16,22,29,34,38,42,47,49,49,52,53,54,54,54,55,58,60,59,52,39,28,22,21,21,29,43,55,40,22,21,24,27,32,38,46,53,
+60,66,69,71,72,74,71,54,37,37,39,42,45,47,49,52,55,59,63,69,78,88,102,118,139,165,192,214,229,239,243,247,249,251,251,249,247,245,243,237,231,224,215,207,202,199,196,193,
+189,187,185,184,184,185,186,187,187,187,187,187,187,187,186,186,185,184,183,182,180,178,176,174,172,169,167,164,160,157,153,149,146,142,138,133,129,125,120,116,111,106,103,99,97,97,98,97,
+96,94,94,92,89,87,86,84,80,78,77,77,77,74,64,50,37,29,24,22,27,40,50,34,12,9,11,14,19,24,30,37,43,48,52,52,53,52,48,27,5,2,2,2,2,2,3,3,
+3,4,3,4,5,4,3,3,3,4,4,3,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,7,9,12,17,25,32,40,48,54,56,56,56,57,64,68,73,82,95,100,97,91,82,68,53,42,36,34,
+34,36,44,58,75,84,71,38,15,14,16,17,17,18,19,21,24,29,33,36,38,40,40,37,35,37,40,43,45,48,53,58,64,72,82,95,111,130,152,175,197,219,236,245,249,251,251,251,
+250,248,243,236,228,223,217,211,204,197,192,189,187,187,187,188,189,190,191,192,193,195,196,197,197,198,198,198,198,198,197,196,196,194,194,192,190,188,186,184,182,180,177,174,170,168,164,160,
+155,152,148,145,140,136,132,129,127,127,127,127,127,126,124,120,116,113,113,114,114,119,126,128,124,116,106,92,77,64,56,52,49,49,54,65,79,87,72,38,14,10,9,8,8,7,6,8,
+9,12,16,17,17,17,16,8,3,3,3,3,3,3,4,4,4,4,4,4,5,5,4,4,4,5,4,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,24,33,37,41,44,45,46,50,52,52,48,44,36,29,24,
+21,19,22,24,28,38,54,71,87,99,100,93,81,71,69,73,74,73,77,89,95,89,73,54,37,24,15,12,13,15,16,17,19,20,22,23,24,26,28,32,36,39,43,46,51,57,64,76,
+90,108,127,146,168,191,211,227,238,245,249,251,251,249,246,244,239,230,218,207,199,193,190,188,186,185,185,186,189,191,193,195,197,198,200,202,204,205,205,206,207,207,207,208,207,207,206,206,
+205,204,203,202,200,198,196,194,191,189,186,183,180,177,174,169,168,170,169,167,165,162,158,155,152,149,145,139,132,123,113,106,99,93,90,87,86,90,98,110,119,126,125,117,105,94,90,91,
+91,87,89,97,103,96,77,57,40,24,13,9,8,7,7,7,6,6,5,4,3,2,1,2,2,3,3,3,3,3,3,4,4,4,4,4,5,5,4,4,4,5,4,3,3,3,3,4,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
+10,37,49,50,49,49,49,46,40,32,23,15,9,4,2,2,3,4,5,6,12,23,37,54,67,74,78,78,70,58,51,47,44,39,36,36,38,37,43,53,61,60,48,34,28,28,34,41,
+46,48,52,58,61,57,51,45,45,47,52,59,68,81,98,120,145,170,190,209,224,236,244,248,250,251,250,246,241,233,224,218,210,199,189,183,180,180,181,183,185,188,191,193,196,198,201,204,
+206,208,209,210,212,213,214,214,215,215,216,216,216,215,215,214,213,213,211,210,209,207,206,203,201,198,196,192,189,186,182,178,179,183,184,180,176,172,168,162,155,147,138,129,120,112,105,100,
+94,90,85,82,81,84,90,100,108,110,111,108,99,86,77,71,65,59,54,51,50,48,50,58,65,62,49,33,24,23,28,33,36,37,38,41,41,35,24,13,7,4,2,2,1,1,2,2,
+2,2,2,2,3,3,3,3,4,4,4,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,1,14,27,30,31,31,31,30,28,22,14,8,4,3,9,15,29,42,44,44,43,40,37,34,30,25,26,26,26,30,34,37,41,49,58,65,65,57,46,38,35,30,23,15,9,
+5,3,3,3,4,7,13,28,52,77,91,89,80,72,67,67,67,68,77,97,109,114,113,107,103,103,108,116,131,148,168,191,212,229,239,245,248,250,250,249,248,244,238,226,212,200,191,185,
+181,177,176,175,178,181,184,188,192,195,199,202,205,207,210,212,214,215,217,218,219,220,221,222,222,222,222,222,222,222,222,222,221,220,219,218,218,219,218,216,214,212,210,207,203,198,193,189,
+185,183,181,180,180,177,172,167,162,156,150,143,136,131,126,121,118,116,113,111,112,115,116,113,104,92,82,76,68,59,50,41,34,29,27,23,22,21,24,36,57,81,93,88,77,68,61,58,
+56,55,61,78,88,88,82,70,57,46,37,30,28,28,28,29,29,29,29,29,25,18,11,5,3,3,5,3,3,3,3,3,0,3,8,15,22,24,24,24,24,24,24,24,24,21,15,6,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,23,43,48,48,49,49,49,50,51,50,45,38,28,17,12,28,46,50,50,50,50,51,51,52,52,54,54,53,
+51,52,55,60,67,72,72,66,59,54,53,52,51,49,45,39,33,29,29,31,35,39,43,51,62,70,79,83,79,70,58,53,53,55,66,89,110,127,145,158,167,177,187,199,210,221,232,241,
+247,251,252,252,251,250,248,241,232,219,205,191,178,171,168,168,171,174,179,184,189,194,198,202,205,208,211,214,216,217,219,219,220,220,221,222,223,223,223,224,224,224,224,224,224,225,225,225,
+225,224,224,223,224,226,226,224,223,222,219,217,215,213,209,204,199,192,187,187,189,186,181,177,173,169,164,160,156,152,148,142,137,133,129,128,128,128,124,117,108,100,95,91,87,83,76,68,
+59,52,49,49,49,50,52,57,64,71,77,77,69,55,37,27,22,20,25,39,51,60,73,84,89,90,89,87,86,86,86,87,87,87,87,86,85,78,66,49,30,11,3,1,2,1,1,1,
+51,61,74,89,99,101,101,101,101,101,101,101,101,98,88,70,48,26,10,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,11,13,13,14,14,14,16,23,31,39,46,
+51,50,46,43,38,31,25,21,19,18,18,21,25,28,30,31,34,42,55,68,74,70,62,54,49,48,52,54,56,59,63,67,71,72,72,72,73,72,72,68,61,55,56,62,69,76,82,88,
+93,100,111,128,149,168,184,195,205,216,228,237,243,246,249,250,251,250,249,246,242,236,229,222,212,198,180,167,162,164,171,181,191,197,202,209,214,216,218,220,222,224,225,227,227,228,227,226,
+224,222,220,219,218,218,216,216,215,215,215,215,215,216,217,218,219,220,221,222,223,224,224,223,222,221,220,218,216,215,213,212,209,206,202,198,193,186,180,173,168,162,157,152,149,145,140,135,
+130,129,130,131,130,121,110,98,90,85,84,82,80,79,79,81,81,79,77,75,71,68,65,59,46,33,26,22,19,13,9,6,5,4,3,4,6,9,16,26,37,46,55,62,63,63,63,64,
+64,64,64,65,70,79,87,92,86,61,30,11,5,9,21,33,119,120,120,115,107,105,105,105,105,105,105,105,105,108,117,129,125,103,77,63,56,44,30,22,16,12,11,11,11,13,14,13,
+12,10,5,1,0,0,0,0,0,0,0,0,0,1,4,10,19,30,41,49,51,48,42,35,31,27,26,29,34,39,45,55,67,78,87,93,92,87,84,83,81,82,83,83,84,85,86,92,
+97,100,101,99,98,98,100,104,107,113,123,136,149,162,173,180,184,188,195,206,219,229,234,236,238,242,246,248,249,249,249,247,242,235,224,213,201,189,181,179,184,191,190,184,182,190,202,211,
+214,215,217,218,219,221,223,223,225,226,226,226,226,226,224,224,220,215,208,203,199,194,189,185,182,180,180,180,182,184,187,191,195,199,203,208,211,213,216,219,220,221,220,220,218,217,214,211,
+209,208,207,205,202,197,191,184,178,172,166,160,155,150,146,144,144,142,138,130,115,101,89,81,75,69,65,61,57,54,53,53,55,55,52,48,43,40,41,43,41,36,35,35,36,34,34,33,
+32,30,25,19,14,10,5,3,2,3,6,8,9,9,9,10,10,9,9,9,13,19,30,49,75,96,95,76,63,75,96,109,85,70,56,42,31,28,28,28,28,28,28,28,28,31,46,76,
+100,111,117,118,117,113,105,97,88,83,80,80,82,85,81,72,70,66,56,46,37,26,18,11,5,0,0,0,0,0,0,0,0,0,6,15,27,38,46,51,55,60,67,77,88,100,109,116,
+122,127,133,145,156,164,169,171,170,171,171,171,171,170,171,171,171,171,172,174,177,182,189,198,206,211,218,225,231,237,240,242,242,243,244,246,249,249,250,249,248,247,247,245,242,239,233,222,
+208,191,175,162,154,147,146,152,166,189,208,214,215,218,220,217,209,206,208,209,210,212,214,216,217,217,215,212,207,202,195,191,185,177,168,160,152,145,138,132,128,125,124,125,129,133,138,142,
+149,157,164,173,181,187,196,203,208,213,216,218,219,219,219,217,214,209,206,203,202,200,198,195,191,186,182,178,173,168,163,156,149,138,126,114,103,96,90,85,80,74,69,64,59,54,50,45,
+41,37,36,40,47,58,74,94,109,111,109,109,110,110,109,108,107,105,100,91,82,72,57,40,25,14,7,4,1,0,0,0,0,0,0,1,1,2,7,23,53,98,139,150,147,151,144,122,
+56,36,25,22,23,25,25,24,24,24,24,24,21,16,13,18,29,44,60,69,73,85,97,103,109,112,113,114,115,113,96,78,75,79,84,86,86,83,77,70,58,42,29,18,10,5,1,0,
+0,0,0,0,0,4,11,22,38,61,87,113,137,157,170,177,184,192,203,215,225,230,231,231,231,231,231,231,231,231,232,232,233,234,235,238,239,241,242,243,245,247,249,249,250,251,251,251,
+251,251,252,252,251,250,248,247,245,242,236,228,218,207,194,181,167,155,147,145,148,157,167,180,192,202,208,209,209,213,215,212,206,205,207,209,212,213,214,212,209,204,197,186,173,158,143,129,
+115,102,91,82,73,68,63,60,58,57,57,59,61,64,67,70,77,88,100,113,127,141,155,168,180,191,200,207,213,217,221,224,224,221,214,208,202,197,194,190,187,182,178,173,167,161,154,145,
+135,127,119,113,108,101,95,89,83,78,72,66,61,57,53,53,56,64,76,90,100,107,108,113,126,128,121,115,114,113,113,112,111,111,115,119,123,124,122,113,99,82,67,55,41,30,28,28,
+29,30,30,33,41,54,71,91,110,125,133,128,119,126,124,104,89,85,87,94,99,103,103,101,101,101,101,100,97,89,77,67,63,62,62,55,47,42,39,40,43,46,46,47,46,42,29,18,
+16,21,29,39,49,61,69,78,85,88,84,77,68,58,45,34,24,17,13,11,10,13,24,43,75,117,156,186,206,220,228,231,235,238,242,244,245,246,246,246,246,246,245,246,247,247,247,248,
+249,250,250,250,249,249,248,248,248,248,248,247,246,244,241,240,240,239,238,236,229,222,217,216,217,216,211,206,197,189,181,178,178,180,181,185,192,200,207,212,211,202,192,186,187,193,203,211,
+215,217,218,219,219,217,213,205,194,181,165,145,125,104,84,65,52,39,30,23,18,14,11,10,10,9,10,10,10,10,11,12,16,20,29,39,54,70,87,108,128,148,166,183,195,206,215,224,
+231,235,232,225,221,213,203,196,190,185,180,175,168,161,153,145,139,133,126,119,113,106,100,93,87,82,80,80,82,84,87,96,107,115,115,108,95,80,63,53,56,55,48,43,42,40,40,39,
+37,38,42,50,57,69,85,102,115,121,123,122,115,107,104,106,113,119,121,124,132,142,151,156,149,116,80,51,34,42,65,84,56,72,87,98,103,106,106,105,105,105,105,105,108,114,119,119,
+119,118,117,115,110,100,86,72,59,46,38,33,29,27,25,23,23,23,24,26,30,34,34,34,42,51,61,71,79,84,87,85,83,79,76,76,78,88,108,136,173,207,230,241,246,248,249,249,
+249,249,248,246,243,240,239,239,240,240,241,242,243,243,244,243,243,241,239,237,236,236,236,236,236,235,231,225,219,209,199,193,190,188,185,177,163,148,138,135,138,143,147,152,158,163,164,168,
+180,190,194,199,204,207,210,212,212,206,199,195,195,195,199,204,210,215,217,216,211,204,192,176,155,132,108,84,63,46,32,23,16,11,8,7,5,5,4,3,2,2,1,1,1,0,1,0,
+2,2,3,6,10,17,27,41,60,81,107,132,156,177,194,209,225,237,244,243,242,242,233,221,213,207,203,198,193,186,179,173,168,162,153,145,139,133,128,122,117,115,120,126,128,128,126,123,
+116,99,80,61,46,35,29,25,22,20,17,15,14,13,12,10,9,9,8,8,9,11,17,27,42,57,69,84,98,106,107,112,128,141,144,148,152,154,153,153,146,121,93,69,49,34,30,36,
+51,43,35,31,30,29,29,28,28,28,28,28,32,42,53,63,68,74,88,108,131,151,154,151,145,134,123,113,105,100,100,100,100,101,102,104,106,105,99,85,73,63,55,49,49,53,61,75,
+93,108,120,130,144,164,188,210,230,242,249,250,249,248,246,245,243,239,235,230,221,213,210,208,208,208,207,203,200,197,194,191,188,185,184,184,184,184,184,184,183,178,170,159,147,133,122,114,
+111,110,107,102,92,83,77,75,77,80,84,91,99,107,113,120,132,143,149,157,166,173,178,185,194,204,210,214,215,214,213,212,210,209,205,197,186,169,147,122,95,69,46,28,15,9,5,3,
+2,2,2,3,3,3,3,3,3,3,3,3,2,2,3,4,4,4,5,5,6,7,9,13,19,31,49,72,99,126,153,177,199,220,239,248,250,252,251,244,230,221,213,205,199,195,194,192,
+186,179,176,173,168,163,158,154,150,146,140,130,118,108,95,82,68,54,44,38,35,32,30,28,25,22,20,18,16,15,14,13,12,11,9,8,8,7,5,4,4,6,10,15,23,29,32,34,
+45,55,57,62,69,74,75,80,93,108,119,121,117,105,87,71,115,101,79,58,43,33,28,26,25,24,24,24,24,26,29,35,45,63,86,109,132,149,151,147,142,135,127,118,110,108,111,115,
+121,131,143,154,157,157,157,154,150,144,135,123,113,102,91,93,108,127,149,172,192,213,231,240,244,247,246,240,229,216,204,196,186,176,166,155,141,129,123,120,119,118,112,104,100,98,96,95,
+95,95,96,97,97,98,99,98,97,94,86,78,70,64,58,56,55,56,57,57,56,56,57,60,64,69,73,78,84,89,96,103,110,117,124,131,138,146,154,161,170,182,193,202,210,217,220,220,
+217,211,198,181,159,132,103,73,47,26,12,5,1,1,0,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,2,2,2,3,3,4,4,4,6,6,7,11,19,32,54,80,108,139,
+166,189,215,238,250,253,253,252,243,229,220,206,190,181,177,174,166,159,155,153,147,141,136,129,125,117,105,90,79,70,63,56,52,47,44,41,38,34,31,29,26,23,21,19,17,16,15,13,
+12,11,10,10,9,8,7,6,6,6,5,3,2,3,2,2,3,4,4,4,7,8,8,11,19,34,53,70,89,108,119,122,91,107,119,120,114,108,104,102,101,100,100,101,100,101,100,103,
+110,117,119,113,103,91,76,62,51,43,41,45,54,69,87,100,113,129,142,149,147,146,147,149,151,151,152,154,151,140,120,112,126,153,185,214,232,243,248,250,249,246,235,211,177,147,124,110,
+99,88,71,57,46,38,34,32,32,32,31,31,32,32,33,32,33,34,35,35,35,38,38,38,39,37,35,33,33,33,33,35,36,39,41,45,48,50,55,59,64,69,75,81,87,93,100,106,
+113,119,127,133,140,147,155,161,168,175,182,189,196,202,208,209,207,199,185,162,131,98,65,38,19,8,3,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,
+1,1,1,2,1,2,2,2,3,3,5,10,21,39,64,94,125,154,180,207,235,251,254,253,253,248,239,232,217,196,183,175,166,156,145,136,129,122,115,108,102,95,88,82,76,71,66,60,
+57,52,47,43,40,35,32,30,27,24,22,20,18,16,15,14,12,11,11,10,9,9,8,7,7,7,6,6,5,5,5,4,3,3,3,2,3,3,2,1,0,1,3,8,17,33,50,65,
+16,32,54,72,86,97,102,104,104,104,104,104,104,104,105,104,97,80,60,42,29,19,11,7,9,18,40,67,91,109,119,121,120,113,102,86,74,68,69,70,71,73,77,82,89,97,108,131,
+165,198,224,238,245,248,247,244,239,230,206,166,124,98,82,75,71,63,37,16,11,10,9,9,8,9,9,10,10,11,11,11,12,13,13,14,15,16,17,18,19,20,21,22,24,26,27,31,
+33,37,40,43,47,51,56,61,66,71,77,83,90,96,103,109,115,122,130,137,145,151,158,165,172,178,184,190,194,197,198,193,186,172,151,123,91,59,32,14,5,2,1,1,1,1,1,1,
+1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,4,12,27,52,83,116,147,174,202,232,250,253,253,254,252,249,245,233,219,208,
+200,189,169,150,142,136,128,121,115,109,103,97,92,88,82,77,71,65,59,52,47,42,37,33,30,26,23,21,18,16,15,14,13,12,10,9,9,8,7,7,6,6,6,6,5,6,4,4,
+4,4,3,4,4,4,3,2,3,3,2,1,1,1,2,6,0,0,3,17,34,49,59,62,62,57,50,48,48,53,59,59,54,44,35,36,40,45,50,58,68,87,111,121,115,99,80,65,
+52,37,24,13,7,5,6,8,11,19,34,57,89,126,164,199,224,238,245,246,245,239,227,204,180,157,128,91,62,49,43,40,40,36,18,6,4,5,5,6,6,6,7,7,7,8,8,8,
+9,10,10,11,12,12,14,16,17,17,18,20,22,25,27,30,34,38,41,45,49,53,57,62,68,73,79,85,91,97,104,111,118,125,132,139,147,154,160,168,174,181,187,191,195,197,193,184,
+169,146,117,85,54,28,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,10,26,
+52,84,120,150,176,200,229,247,253,253,253,253,251,247,241,233,224,215,200,185,178,172,165,158,152,147,143,139,134,130,126,121,115,107,97,86,78,68,60,52,45,38,31,27,21,19,18,16,
+15,14,14,13,12,11,10,9,9,8,7,6,5,4,4,4,4,3,3,4,4,4,3,2,3,3,3,3,3,2,1,0,1,15,40,66,87,103,116,124,123,116,106,100,96,101,110,114,
+116,114,112,114,119,120,120,121,121,118,100,72,45,23,11,5,1,0,0,1,3,7,12,21,34,57,89,130,170,202,226,239,245,247,244,237,223,199,165,126,89,61,39,22,11,6,5,4,
+4,5,5,5,5,4,5,6,6,7,7,7,8,8,9,9,9,9,10,11,13,13,14,16,17,19,27,31,33,33,34,34,35,37,40,45,49,53,58,62,68,73,79,86,91,98,104,111,
+118,125,133,140,148,155,162,170,176,182,188,192,195,194,187,175,155,129,98,65,36,15,4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,12,31,60,95,129,159,183,207,230,248,252,252,252,252,250,248,244,240,234,228,225,224,221,215,210,205,203,201,199,197,195,193,190,
+186,178,167,154,143,131,118,107,94,81,72,62,52,44,41,37,34,32,32,30,30,29,29,27,25,22,19,15,12,9,8,7,5,4,4,6,6,6,5,5,6,6,6,6,5,2,0,0,
+68,97,126,154,173,186,200,210,211,206,202,199,187,175,178,183,185,180,166,148,130,115,100,86,73,56,34,16,9,7,7,8,10,12,16,21,29,40,56,77,104,137,174,206,229,240,245,246,
+244,237,221,194,158,118,81,51,29,17,9,6,4,2,2,2,2,3,5,5,5,4,4,6,6,6,7,8,9,8,8,10,10,10,11,12,13,14,15,16,16,27,53,65,67,66,66,64,
+58,51,48,48,50,55,61,66,73,81,91,101,108,115,122,127,133,137,141,145,150,156,163,170,177,183,189,192,193,190,181,168,149,121,86,50,23,7,2,0,1,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,18,43,76,111,145,173,197,220,238,250,252,252,252,251,250,249,
+248,247,247,248,248,247,246,243,242,241,241,240,239,239,238,237,236,233,227,220,213,205,196,186,174,162,155,144,130,122,117,112,104,98,93,89,88,87,87,86,83,78,75,71,65,60,55,50,
+46,42,37,33,29,25,23,23,25,26,26,23,16,11,15,28,194,202,213,229,237,242,245,247,247,246,245,245,242,233,233,235,236,233,219,190,154,127,103,80,62,50,45,44,44,45,45,46,
+49,56,65,78,93,113,139,165,188,211,230,241,246,246,243,235,219,191,155,114,75,45,25,13,6,4,2,3,4,4,3,3,3,3,4,5,5,5,4,5,7,7,7,8,8,9,8,10,
+11,10,11,12,13,14,15,16,17,24,43,53,57,63,68,75,80,82,78,77,76,81,87,94,100,108,118,132,144,151,156,161,165,168,169,171,172,171,172,174,179,184,189,192,193,191,185,172,
+146,109,68,34,12,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+12,32,62,99,134,163,188,216,236,246,252,252,252,251,251,251,251,251,251,252,252,252,251,251,250,250,250,250,250,250,250,249,249,248,247,245,244,243,240,237,232,226,218,208,197,192,191,192,
+191,190,188,185,183,182,182,183,180,175,169,166,162,155,147,141,137,135,131,125,116,105,96,91,93,102,109,106,101,111,138,167,248,247,248,248,248,247,247,247,247,247,248,248,248,248,248,248,
+248,248,248,240,221,202,184,163,144,132,127,125,125,125,126,127,132,140,153,166,180,197,215,228,237,243,246,246,242,232,214,186,150,110,73,43,23,11,4,2,1,1,2,3,4,4,4,3,
+3,3,3,4,5,5,6,6,6,7,7,8,8,9,9,10,10,11,12,13,14,15,15,16,18,19,21,24,27,31,36,42,54,66,76,84,89,93,95,97,101,102,105,117,130,138,143,148,
+154,162,171,180,187,191,193,194,194,196,198,201,203,201,192,168,133,93,55,26,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,8,27,55,91,127,158,181,206,234,247,251,252,252,251,251,251,251,251,251,251,252,251,249,246,244,243,243,243,242,242,241,241,
+241,243,245,245,246,247,248,248,247,246,243,239,235,234,233,234,235,236,237,238,238,237,237,237,235,232,226,222,219,212,204,198,197,200,203,205,205,203,200,198,204,218,226,226,228,235,245,249,
+247,247,247,247,247,247,247,247,247,247,246,246,247,248,248,249,249,249,249,249,247,243,238,228,218,212,211,213,213,214,213,213,215,220,226,231,235,239,244,246,247,245,242,233,212,181,143,104,
+68,40,22,10,4,1,0,0,0,2,2,3,3,4,4,3,3,4,3,4,5,5,5,6,6,7,8,8,9,9,10,10,10,11,12,13,13,15,16,16,18,20,21,23,24,27,30,32,
+36,40,46,54,60,64,67,70,74,78,82,90,98,103,110,118,124,132,143,153,165,178,189,198,203,207,210,211,209,201,184,157,122,86,53,25,8,2,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,9,26,54,89,126,157,180,197,224,246,251,252,252,251,250,250,
+250,249,248,245,241,235,228,219,214,210,208,206,204,203,201,201,204,209,216,221,226,231,236,239,240,243,246,247,247,247,247,247,246,246,246,247,247,246,246,247,246,245,244,243,242,239,235,233,
+234,236,238,240,241,242,244,245,249,252,252,252,252,252,251,249,248,248,247,247,248,246,245,238,227,211,195,187,187,190,194,198,207,222,235,235,235,238,245,247,247,246,247,248,247,247,247,247,
+247,247,248,249,249,249,246,241,235,226,208,178,139,99,63,36,19,9,3,0,0,0,0,0,0,0,0,1,1,1,2,2,2,3,3,4,5,5,5,6,6,7,8,9,9,9,10,10,
+11,11,11,13,14,15,16,16,18,19,21,24,26,28,31,33,37,39,41,45,49,54,58,64,69,75,81,86,93,99,107,114,120,126,134,141,149,158,168,178,187,194,199,200,198,190,176,154,
+125,91,56,28,10,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
+10,28,58,94,129,160,182,199,222,245,253,252,251,250,248,244,242,238,232,217,201,191,180,171,162,155,151,147,143,139,136,134,135,141,148,156,165,174,184,193,201,212,224,232,236,236,236,237,
+236,236,236,236,236,236,236,236,237,240,242,245,245,246,246,246,247,247,247,247,247,247,248,248,249,249,250,250,250,249,248,248,216,209,204,202,200,188,172,150,124,97,76,68,67,67,68,73,
+84,110,142,147,142,145,165,193,206,208,213,221,227,233,237,241,242,243,242,239,235,227,214,202,190,174,145,106,66,36,18,8,3,0,0,3,8,13,19,23,24,25,25,25,26,24,20,14,
+8,2,2,2,3,5,5,5,6,7,7,9,9,9,10,11,11,12,12,12,14,15,16,17,18,20,21,24,26,28,30,33,37,40,42,46,50,55,59,64,70,75,80,87,93,100,106,113,
+120,127,134,141,148,155,162,169,176,182,188,191,192,188,178,160,134,101,66,36,14,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14,36,68,104,139,168,190,211,232,250,253,252,249,247,239,231,222,213,195,171,156,148,139,131,122,116,109,104,98,94,89,84,
+83,84,85,88,92,98,106,114,125,140,157,171,181,184,185,186,186,185,184,184,183,184,184,185,190,198,208,217,223,229,234,237,242,247,247,248,248,248,248,248,247,245,238,231,227,226,225,222,
+113,96,86,81,74,63,50,36,23,13,8,7,7,7,8,12,20,35,57,63,55,47,57,77,94,111,130,148,159,162,163,170,180,184,181,172,157,140,129,122,113,104,90,74,56,41,34,35,
+41,48,56,67,77,88,97,100,101,101,101,102,102,100,94,83,66,42,23,11,4,2,3,4,5,6,7,7,9,9,9,10,12,12,12,12,13,15,16,17,18,20,22,23,25,28,30,33,
+35,38,40,45,49,53,57,62,68,73,79,86,92,98,105,111,118,125,132,140,147,154,160,168,175,181,187,190,192,190,183,169,146,116,81,49,23,8,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,8,24,51,87,125,159,185,207,228,246,253,252,250,248,242,232,221,
+209,192,170,151,137,129,122,114,107,101,95,88,82,76,71,66,62,59,56,54,53,53,54,57,62,69,80,89,96,99,100,99,99,98,97,95,95,96,96,98,103,114,126,140,152,164,175,183,
+194,208,214,215,215,214,214,210,198,177,151,136,138,146,145,133,26,17,12,8,6,4,3,1,0,0,0,0,0,0,0,2,8,17,29,38,38,32,33,42,55,72,85,87,80,71,64,61,
+63,67,65,60,58,61,63,52,36,29,30,38,50,62,78,100,121,134,135,129,123,118,112,107,105,105,105,105,106,108,114,120,124,115,97,75,52,29,15,10,6,4,4,6,7,7,8,8,
+9,10,10,11,12,13,14,15,16,18,19,22,24,27,31,33,38,45,50,54,59,62,67,70,73,75,79,84,90,96,103,110,117,123,130,137,145,152,159,166,172,180,185,189,193,193,189,178,
+160,134,103,69,40,17,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,19,
+43,76,114,150,178,200,219,242,251,249,248,243,235,225,219,213,207,199,187,172,155,137,123,112,103,95,89,83,77,71,66,60,55,51,47,43,39,37,34,33,33,34,35,36,39,40,40,40,
+42,44,45,45,45,45,45,44,43,45,51,57,66,76,84,91,98,105,111,112,112,111,108,100,85,65,53,53,62,67,60,43,2,0,0,0,0,0,0,0,0,0,0,3,10,16,23,34,
+48,61,71,79,88,89,90,93,99,106,112,108,99,95,92,77,60,49,40,35,38,46,45,34,21,18,26,43,65,91,117,135,138,126,103,76,57,44,35,29,28,28,28,28,29,31,40,54,
+75,99,114,122,119,104,84,66,51,38,32,29,28,31,33,33,34,34,35,35,34,31,28,27,25,25,28,36,44,52,56,61,67,75,80,84,87,90,94,97,98,98,99,97,91,94,101,108,
+115,121,128,135,142,149,157,163,170,176,182,188,192,194,193,186,175,155,128,96,65,36,16,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,2,6,18,40,71,106,140,167,187,206,232,246,241,238,230,215,201,192,187,183,184,188,192,191,187,175,160,144,129,116,105,98,91,87,83,78,
+74,70,67,62,57,51,44,39,35,31,31,35,41,45,46,48,53,56,57,59,59,58,57,56,53,49,46,36,23,22,26,28,29,29,30,30,30,30,27,24,19,15,15,18,20,17,12,6,
+0,0,0,0,0,0,0,0,0,3,27,59,79,91,100,108,116,119,120,119,118,118,118,119,120,122,124,127,130,138,146,145,139,132,122,111,106,104,99,96,93,98,107,115,119,119,111,90,
+64,40,20,8,1,0,0,0,0,0,0,0,0,0,0,3,10,24,41,63,88,109,122,130,133,128,121,114,106,105,107,108,108,109,108,109,108,103,97,94,90,90,95,101,99,93,88,83,
+77,72,70,70,74,77,81,86,94,102,108,104,91,91,98,104,111,117,124,132,139,146,153,160,166,173,179,185,190,194,195,193,186,173,154,128,98,67,39,19,7,1,1,1,0,0,1,1,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,8,21,43,71,103,135,161,181,196,221,240,233,226,219,202,189,181,174,168,161,
+156,155,156,162,169,176,179,181,179,172,164,155,147,142,140,137,134,132,129,127,123,116,108,102,96,93,96,99,95,85,76,69,60,51,45,42,42,40,40,41,45,50,51,38,13,4,4,4,
+4,4,6,6,6,6,5,3,2,3,4,4,2,1,0,0,0,0,0,0,0,0,0,0,0,11,64,111,119,113,106,97,85,72,64,56,49,46,46,46,47,47,48,50,57,68,80,95,
+114,129,136,139,142,150,156,158,158,158,157,143,112,79,48,20,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,7,24,52,89,133,160,163,158,142,121,112,110,111,
+112,112,113,113,117,123,126,127,131,139,151,155,148,134,124,112,94,79,70,64,62,64,67,71,78,86,93,96,95,97,103,108,112,117,124,129,136,142,149,156,162,168,175,181,187,192,195,196,
+194,187,176,158,134,105,76,48,27,12,6,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,2,6,14,30,52,80,109,
+138,163,182,196,214,232,230,219,211,199,189,183,177,170,164,156,148,141,134,131,132,142,158,181,195,194,188,174,156,146,141,139,136,134,131,130,131,133,134,134,135,141,151,154,145,129,116,100,
+79,60,46,34,29,25,24,23,27,31,34,29,20,15,14,11,8,8,6,4,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,39,60,52,39,30,21,
+13,6,2,0,0,0,0,0,0,0,0,0,1,3,7,13,25,38,48,54,62,76,94,111,126,134,140,134,116,92,66,42,24,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,
+5,11,21,34,53,81,111,132,134,114,85,62,45,37,36,36,38,39,39,40,43,50,57,63,72,92,116,139,159,167,168,163,153,142,134,127,122,120,119,120,124,127,131,135,138,143,147,146,
+145,147,149,150,154,159,164,169,172,174,176,179,183,188,192,196,197,196,190,181,166,145,120,92,66,43,26,14,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,1,0,1,2,6,14,27,47,72,100,128,153,173,189,200,212,223,221,212,206,198,190,184,177,172,165,158,152,147,143,141,141,146,156,170,179,176,160,136,114,98,87,81,77,
+73,70,66,64,64,66,69,71,77,94,116,137,156,163,162,157,145,130,119,108,100,93,89,87,86,87,87,86,86,87,87,78,69,65,59,50,48,48,46,44,37,26,15,5,0,0,0,0,
+0,0,0,0,0,0,1,5,9,14,21,28,28,26,24,24,23,23,23,22,18,12,8,4,1,0,0,0,0,0,0,0,0,0,0,2,17,32,47,70,113,141,160,173,182,186,187,180,
+169,157,142,106,68,38,21,14,10,8,9,11,12,17,28,43,60,79,95,109,120,122,110,84,54,28,13,7,7,7,7,8,8,9,10,10,10,13,23,38,58,81,102,118,132,137,134,130,
+125,127,136,144,148,148,146,146,149,151,153,156,160,163,166,164,160,162,164,167,174,178,182,187,188,188,188,187,187,188,190,194,197,199,198,196,189,177,162,140,118,93,69,47,30,17,9,4,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,9,18,31,49,71,98,125,152,174,192,203,211,217,221,217,209,204,199,194,188,183,178,172,167,165,166,
+168,171,175,178,179,177,167,146,122,100,84,73,66,61,56,52,48,44,40,36,32,31,36,47,64,84,102,116,128,131,127,120,114,114,122,129,130,128,122,121,120,120,119,118,119,119,119,111,
+100,95,92,89,94,95,93,94,89,77,65,48,30,16,5,0,0,0,0,0,3,24,51,68,78,84,89,94,98,100,100,100,100,101,101,100,95,87,77,68,54,41,29,20,13,9,11,23,
+35,63,98,134,163,170,175,180,178,169,166,170,180,192,206,215,216,216,217,220,216,200,178,154,131,116,103,89,83,88,100,111,117,117,112,101,86,63,37,16,5,2,4,6,7,8,9,9,
+8,8,10,18,30,48,70,89,99,97,89,78,67,57,52,49,49,53,63,75,82,85,87,89,93,96,100,104,109,114,117,118,119,123,128,136,146,152,156,163,169,174,181,187,189,192,191,191,
+194,198,200,201,200,199,194,185,171,153,131,110,88,67,49,35,24,16,11,7,4,4,3,1,1,1,0,0,0,0,1,1,3,5,8,14,21,32,46,64,84,107,130,152,173,191,205,215,
+221,225,228,226,221,218,215,212,209,203,199,197,193,191,192,194,193,188,181,172,158,140,118,100,87,79,74,69,64,60,55,51,47,42,40,41,48,62,80,96,103,99,89,76,62,50,41,34,
+30,33,41,50,55,55,53,52,51,51,50,49,49,48,48,43,37,36,35,38,45,46,44,47,49,49,56,60,55,48,29,5,0,0,0,0,11,67,116,124,119,116,114,110,107,105,105,105,
+105,105,105,107,110,116,118,120,118,112,103,92,84,101,147,185,200,208,200,179,154,137,132,128,116,111,112,116,120,125,130,135,135,136,138,145,155,172,190,204,210,214,215,207,186,163,144,118,
+86,58,34,18,9,1,0,0,0,0,0,0,1,2,3,6,12,25,43,66,85,96,97,85,67,47,35,28,23,22,24,26,28,30,33,37,40,44,47,51,54,59,64,68,73,78,83,89,
+93,98,105,112,119,124,130,137,144,150,158,166,174,182,185,185,189,194,198,200,204,211,215,212,204,194,182,167,150,132,114,96,80,66,53,44,36,30,26,23,21,20,19,19,21,22,26,30,
+36,44,54,66,79,96,114,132,150,168,184,196,206,213,219,223,225,226,225,224,223,222,221,218,214,209,207,203,201,196,188,179,166,152,139,124,113,102,93,87,82,77,71,66,61,56,51,49,
+50,57,69,85,99,107,104,92,71,49,34,23,17,14,11,11,10,9,8,8,8,7,8,7,6,5,4,3,3,3,2,2,1,1,0,1,0,0,0,0,1,3,7,13,21,29,23,4,
+0,0,0,0,8,49,79,68,52,45,40,34,29,28,28,28,28,27,27,28,33,40,47,57,71,92,115,146,187,219,206,172,155,137,120,113,110,110,109,106,103,96,89,84,77,66,56,50,
+50,51,50,48,50,53,56,59,61,68,88,121,154,176,182,180,169,148,112,73,56,50,49,50,50,50,46,43,44,47,57,78,98,109,112,104,87,67,47,30,20,16,17,19,21,24,25,27,
+29,31,32,35,38,42,45,49,52,56,61,65,70,74,80,85,90,95,101,107,113,118,125,131,137,143,149,154,161,167,172,177,183,189,193,197,201,210,215,214,210,208,203,197,189,178,168,156,
+143,131,119,109,99,91,85,81,78,77,78,79,81,85,91,98,106,116,127,138,152,164,176,187,197,204,211,216,218,218,217,216,215,212,210,207,204,202,198,194,188,182,177,173,167,160,149,139,
+128,120,112,105,100,94,89,83,77,72,67,62,60,59,65,76,92,105,111,108,96,77,56,37,25,18,16,15,15,15,14,12,11,10,9,8,8,7,7,6,5,4,3,3,3,3,2,3,
+3,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,20,48,109,159,181,187,160,106,59,44,
+43,43,44,45,44,44,41,36,28,21,14,8,3,16,57,96,113,101,69,38,17,6,2,0,0,0,0,0,4,18,31,53,83,109,144,168,174,176,176,178,177,180,183,185,191,197,203,203,
+189,161,124,82,46,25,16,15,16,17,18,20,21,23,25,26,28,31,32,34,37,40,43,47,51,55,58,62,67,71,76,81,85,91,96,102,108,114,119,125,131,137,143,148,154,159,165,170,
+176,181,186,190,195,200,204,206,207,208,209,208,207,204,201,196,190,184,177,171,164,159,155,151,148,146,147,149,151,154,158,163,170,176,183,190,196,202,208,210,214,215,216,216,215,213,210,207,
+203,199,195,191,187,182,177,171,165,160,154,148,142,136,129,123,118,112,106,100,95,89,84,79,76,74,76,82,91,102,112,116,113,101,81,61,43,30,23,21,20,19,18,16,16,15,13,12,
+11,10,10,9,8,8,7,5,5,4,3,3,4,4,3,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,21,34,37,37,45,53,49,44,42,39,35,33,33,33,34,34,
+49,77,97,112,127,155,171,179,160,110,75,40,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,80,148,174,161,126,88,57,35,22,15,13,12,12,12,12,11,10,9,8,7,
+6,8,19,36,51,65,75,84,93,105,118,126,128,122,109,86,59,37,23,15,12,13,14,14,16,18,18,19,20,22,24,26,28,30,31,33,36,38,41,44,48,51,56,59,63,68,72,77,
+81,86,91,97,102,108,113,119,125,130,136,142,147,152,158,163,169,173,178,183,188,191,195,199,203,205,208,210,211,212,212,212,211,210,208,206,204,202,201,199,198,196,197,197,198,199,201,203,
+205,208,210,213,214,215,217,216,216,215,214,213,211,208,205,203,199,195,191,187,182,177,173,168,163,158,152,147,142,136,131,125,120,115,109,104,100,100,100,102,106,113,119,122,123,117,104,87,
+66,48,36,30,27,24,23,21,19,18,16,16,15,13,12,11,11,10,9,9,8,6,5,5,4,4,4,4,4,3,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,5,11,
+169,175,176,175,191,211,206,204,205,207,209,209,206,196,186,178,172,163,151,140,134,123,111,89,53,31,20,10,5,3,0,0,0,0,0,1,5,8,11,18,30,59,110,174,208,169,120,90,
+74,69,69,71,72,72,72,72,72,73,73,73,73,73,73,72,72,72,71,69,71,75,79,82,83,79,71,59,44,27,13,5,2,3,6,9,10,10,12,12,13,15,16,17,18,20,22,24,
+26,29,31,32,33,36,39,42,45,48,52,56,60,65,68,72,77,81,86,91,96,101,107,113,118,124,129,135,140,145,150,156,161,166,170,175,179,184,188,191,196,199,202,204,207,209,211,212,
+213,215,215,215,216,218,219,219,219,218,218,217,217,217,217,218,218,218,218,219,218,217,217,216,216,217,217,215,214,212,210,208,206,203,201,197,194,191,187,184,180,177,173,169,165,161,158,153,
+149,145,141,138,136,135,135,133,130,124,113,100,84,66,52,43,35,31,29,27,25,22,21,19,16,15,14,14,13,11,11,11,10,10,9,8,7,6,5,5,4,4,5,3,3,3,1,0,
+0,0,0,0,0,0,0,0,0,11,36,69,98,128,147,157,79,58,55,54,63,74,73,75,84,100,128,160,187,209,211,196,152,96,49,28,21,19,21,25,33,41,45,44,39,33,28,27,
+28,28,33,48,66,86,104,123,152,194,204,162,100,68,68,72,74,74,75,75,76,76,76,75,75,76,76,76,76,76,76,75,75,75,74,73,71,64,56,48,40,30,22,15,11,6,6,7,
+9,10,11,15,19,21,21,22,23,24,25,25,25,24,24,24,23,25,28,30,32,34,37,39,42,46,49,53,57,61,65,68,73,76,81,86,91,96,100,106,112,117,122,127,132,137,143,148,
+152,158,162,167,171,175,180,183,187,190,194,197,199,202,204,207,209,211,211,212,214,217,218,219,220,221,221,222,222,221,220,220,219,219,219,219,220,220,220,219,218,216,214,211,208,207,205,203,
+201,198,195,192,189,186,182,179,175,172,169,165,161,157,154,150,146,142,138,133,128,120,110,101,91,79,67,58,50,44,41,38,35,34,33,33,33,31,29,28,26,25,24,22,18,16,13,11,
+8,7,6,6,5,6,5,4,3,2,2,1,0,0,0,0,0,0,0,1,12,31,56,80,123,159,175,173,159,134,110,97,0,0,0,0,0,0,0,0,0,0,0,5,19,50,79,108,
+145,170,172,164,158,133,86,51,38,44,53,65,82,99,119,142,151,153,161,179,200,222,236,243,243,223,164,100,65,45,20,9,10,13,14,14,14,14,13,14,14,14,14,14,14,14,14,14,
+13,14,13,13,13,14,20,31,40,47,53,59,62,63,64,65,65,66,71,80,87,90,91,92,92,93,93,91,87,80,75,68,57,46,38,33,31,31,34,37,40,43,46,50,53,56,61,64,
+68,72,77,80,86,90,95,99,104,110,115,119,125,130,135,139,143,149,153,157,162,166,170,174,178,181,184,187,190,193,196,198,200,202,204,205,207,208,210,210,211,212,213,215,216,216,216,216,
+215,215,215,216,216,216,214,211,207,202,196,192,189,185,182,179,176,172,167,163,159,155,150,146,141,136,132,127,122,117,112,107,102,97,92,87,83,79,79,84,88,89,91,93,92,91,89,86,
+84,83,87,93,96,98,96,96,95,94,92,90,84,76,67,57,43,29,15,7,1,0,0,0,1,4,2,2,0,1,3,11,31,60,95,134,161,175,176,168,140,99,60,27,11,1,0,0,
+0,0,0,0,0,2,7,9,9,5,1,0,0,0,0,0,2,22,61,97,123,165,202,207,207,207,207,207,210,218,218,214,210,205,195,178,161,151,146,142,137,132,139,162,175,175,143,76,
+39,18,8,9,11,10,7,2,0,0,0,0,0,0,1,4,8,11,15,23,39,60,90,116,129,134,136,139,141,142,143,144,143,143,146,149,150,150,150,151,152,152,152,152,152,150,148,146,
+137,123,104,83,63,45,36,34,37,39,42,46,49,52,56,59,64,68,72,77,80,84,89,94,98,102,107,112,117,121,126,131,135,139,143,148,153,158,164,168,171,174,176,178,180,183,186,188,
+191,192,194,196,197,199,199,201,201,202,202,202,203,203,203,203,202,202,202,202,200,197,195,191,187,184,181,178,177,175,173,169,166,162,158,154,149,145,138,131,125,120,115,110,105,100,97,93,
+91,89,87,90,97,109,129,147,155,157,158,159,158,157,156,155,153,153,154,155,155,155,154,154,153,152,154,157,163,170,174,173,162,140,116,96,78,63,62,86,120,132,132,132,132,136,143,159,
+174,176,161,127,94,64,36,20,4,0,0,0,0,0,0,0,0,5,15,30,46,61,73,80,79,71,60,48,35,22,9,7,39,89,141,170,169,175,189,199,183,151,136,115,84,78,76,58,
+43,32,21,10,2,0,0,0,0,5,22,54,87,123,177,204,201,169,114,83,71,69,67,58,49,45,44,44,44,45,56,69,78,83,86,96,113,133,149,154,146,129,116,111,111,112,113,114,
+115,114,111,103,96,94,95,95,96,97,98,101,108,116,122,131,144,155,159,154,138,111,85,64,50,43,41,41,43,48,51,55,58,62,66,70,74,78,81,86,90,95,99,104,108,113,117,121,
+127,133,141,153,163,173,181,185,188,187,185,185,182,181,180,179,181,182,184,186,188,189,190,191,191,192,192,193,192,193,196,195,192,189,187,186,185,183,181,178,176,176,177,181,184,186,185,184,
+181,178,175,173,169,165,160,151,142,135,132,128,124,122,125,132,136,137,136,141,153,166,177,179,171,155,142,135,132,131,129,128,126,124,121,112,104,100,99,99,98,98,98,101,110,128,149,175,
+201,218,226,225,219,208,198,182,154,136,132,130,130,125,115,95,63,33,12,0,0,0,0,0,0,0,0,0,0,0,0,0,45,65,88,106,116,120,119,117,116,116,114,112,115,120,128,158,
+187,170,119,64,51,48,43,38,18,2,0,0,0,3,31,42,33,21,12,9,9,9,10,14,26,45,66,82,83,76,76,96,123,174,206,200,161,104,86,90,94,93,93,91,91,94,111,137,
+151,153,152,154,155,155,151,136,101,66,43,30,23,21,23,25,27,28,27,23,19,18,19,21,21,21,23,26,30,36,42,49,64,84,107,130,151,159,154,138,117,98,81,66,55,51,50,52,
+55,59,63,66,71,75,80,85,89,92,95,98,103,108,115,123,138,154,170,182,189,193,194,194,197,199,201,202,200,198,194,188,183,176,175,176,177,178,179,181,181,182,183,182,182,184,192,193,
+191,186,182,179,178,176,174,174,176,180,186,190,189,185,180,177,174,172,169,166,163,162,160,161,159,156,153,150,147,146,152,158,159,154,144,136,133,129,127,123,104,79,66,59,56,53,51,49,
+47,44,41,35,29,27,27,26,25,24,23,23,25,28,34,43,65,92,118,139,158,167,159,133,98,70,50,30,15,5,0,0,0,0,0,0,1,2,5,7,7,5,4,3,3,4,10,20,
+114,116,110,98,80,63,51,45,54,80,122,166,202,214,213,197,151,96,55,29,12,1,0,0,0,0,0,0,0,1,14,31,45,51,51,48,47,47,48,51,58,61,57,50,37,23,16,14,
+15,26,57,105,159,178,137,88,86,97,96,104,142,167,182,199,195,187,177,175,187,204,205,196,187,179,156,123,85,43,21,9,5,4,4,5,5,3,3,3,5,6,8,9,11,12,14,16,
+17,23,33,49,76,107,132,150,159,158,150,136,119,104,97,97,98,102,105,107,111,117,125,134,134,131,129,130,133,137,145,156,169,180,180,175,168,162,159,158,161,167,174,181,188,195,200,202,
+200,192,184,177,172,170,168,169,170,170,171,171,171,171,174,179,183,184,183,182,180,178,178,176,178,177,173,168,160,151,145,142,139,135,131,128,124,121,121,122,124,123,120,117,114,110,109,108,
+103,95,82,72,64,57,52,49,42,34,31,29,29,28,27,24,22,20,18,16,13,10,8,8,8,9,8,7,6,6,5,4,5,9,17,32,58,86,110,128,139,139,130,112,90,71,60,57,
+58,58,59,59,61,65,73,82,80,71,65,62,61,65,78,94,95,91,87,72,62,60,78,114,147,171,175,151,106,71,59,67,89,109,114,106,89,69,46,26,11,3,0,0,0,0,0,0,
+8,21,30,33,33,32,32,30,25,16,7,3,0,0,1,2,4,9,30,56,86,156,222,214,206,216,213,197,181,156,137,94,72,63,53,47,60,100,135,136,150,184,216,234,232,207,180,149,
+124,107,95,85,77,64,49,32,18,11,8,8,9,10,11,13,14,15,16,17,22,34,52,74,99,120,138,154,163,164,162,163,166,168,169,170,173,176,180,184,180,171,167,165,166,167,168,167,
+160,148,135,127,123,122,123,126,128,132,136,142,148,155,165,176,189,197,200,197,191,184,176,168,164,161,160,159,159,158,157,158,160,163,167,167,165,164,162,159,155,149,142,137,133,130,126,122,
+119,116,112,109,105,101,97,94,91,87,83,80,75,72,67,64,60,58,58,66,79,96,110,115,113,110,111,111,105,103,102,100,99,98,97,95,89,80,66,50,29,10,4,2,3,4,5,6,
+5,4,4,16,40,74,104,119,128,136,148,160,166,163,160,159,160,160,161,161,162,163,163,162,150,132,123,119,117,118,119,114,164,174,176,176,176,174,169,146,110,75,29,1,0,18,43,65,
+97,143,166,168,161,147,136,123,106,91,73,52,28,11,5,2,1,2,3,3,1,1,1,0,0,0,0,0,0,1,7,26,62,115,173,194,197,199,201,196,197,188,177,127,88,73,67,58,
+54,50,48,48,50,63,95,112,114,124,145,170,199,225,239,247,247,242,234,227,221,212,197,172,143,120,107,99,97,98,94,90,90,97,104,107,107,107,108,114,122,130,141,154,168,174,171,172,
+172,172,171,167,161,155,152,149,138,127,123,123,125,126,123,115,104,100,99,101,104,108,112,115,117,120,123,125,127,130,134,138,148,160,173,184,192,196,195,191,183,176,170,163,157,153,150,148,
+147,146,145,143,141,139,138,136,132,129,127,124,122,120,117,115,112,110,107,104,100,97,93,89,85,82,79,76,74,74,72,70,67,67,75,91,118,152,186,205,211,215,217,218,219,220,220,220,
+219,219,219,219,218,217,211,203,178,136,103,63,36,20,8,4,2,2,3,10,39,91,133,153,167,180,194,206,220,228,229,229,229,228,227,225,222,219,217,214,197,174,172,174,174,173,170,167,
+96,72,48,46,44,37,22,3,0,0,24,75,137,171,177,172,166,151,142,158,180,197,206,213,216,217,213,206,180,151,129,102,82,69,56,47,45,43,44,47,55,65,71,76,81,89,120,172,
+207,209,184,165,169,169,159,150,147,142,135,129,132,133,130,126,122,118,116,115,115,115,123,128,121,109,98,88,86,92,108,130,153,175,194,205,215,229,242,247,247,245,241,238,236,234,232,229,
+227,229,232,234,234,235,234,235,236,238,238,235,228,214,188,154,122,104,99,93,84,78,77,76,72,68,70,72,76,78,79,80,82,86,90,93,95,98,102,105,109,112,114,116,119,121,123,124,
+126,128,134,142,151,162,174,183,189,191,190,187,182,176,171,167,165,162,158,154,151,148,147,145,144,142,140,138,135,135,137,139,139,136,134,132,130,127,124,121,119,116,111,109,113,115,113,111,
+110,108,108,111,114,119,131,142,140,134,126,120,117,115,113,112,111,111,110,110,116,124,136,154,183,207,215,210,194,171,138,99,70,52,41,38,42,50,60,73,93,120,140,152,160,162,155,138,
+120,108,102,93,82,75,77,90,118,138,133,129,129,130,123,111,0,0,0,0,0,0,0,3,54,124,173,174,135,77,47,32,21,9,2,9,25,48,63,74,86,97,115,143,177,197,209,216,
+215,207,191,182,184,187,188,195,206,213,215,216,218,220,219,200,176,169,171,181,188,192,194,194,191,186,176,168,162,156,150,145,140,134,127,117,105,91,81,73,62,50,39,29,20,15,12,12,
+15,24,35,44,56,85,115,132,146,159,168,178,184,186,188,192,192,190,187,187,190,194,196,203,209,216,227,232,234,240,232,201,154,104,58,40,41,45,48,51,54,57,60,63,65,67,70,72,
+75,79,82,87,91,99,115,134,145,149,151,152,154,155,157,158,159,160,160,161,162,165,169,177,183,189,194,198,197,192,187,184,183,182,182,181,180,179,178,176,176,175,174,172,171,171,171,170,
+169,167,165,164,163,161,159,157,154,149,137,127,121,115,112,110,109,105,102,94,84,74,69,64,56,47,38,31,26,21,20,18,17,16,15,14,16,21,29,42,62,83,108,138,162,183,205,216,
+213,200,170,140,124,120,122,135,144,149,149,134,109,81,53,27,9,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,26,73,142,186,153,78,25,1,0,0,0,
+0,0,0,0,0,0,0,0,0,1,8,18,35,52,69,92,115,136,164,174,174,171,171,160,143,130,125,125,126,126,117,112,125,145,163,177,185,189,190,188,183,177,167,158,149,141,134,128,
+122,114,105,93,83,73,64,54,47,40,34,28,23,19,15,12,8,4,2,0,0,0,2,5,12,22,36,53,70,81,85,90,97,100,99,98,99,103,110,124,136,145,148,147,151,172,195,218,
+232,220,156,81,47,40,43,47,49,52,53,56,59,63,70,79,95,113,129,139,147,165,196,221,230,231,232,232,232,233,233,233,233,234,233,233,234,234,233,233,234,234,234,234,229,216,199,184,
+175,163,156,155,156,156,156,153,152,151,150,150,148,145,140,132,128,126,124,122,120,118,116,113,109,101,90,79,69,62,58,57,54,53,49,42,36,32,29,27,24,22,20,19,18,18,16,14,
+13,12,11,8,7,6,5,7,12,19,31,47,62,73,84,104,130,154,187,209,204,186,151,126,124,126,121,111,98,79,59,37,19,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,7,37,78,131,173,176,133,55,6,0,0,0,0,0,1,1,1,2,2,2,2,3,3,3,4,6,9,16,24,30,33,34,36,44,50,52,53,48,39,32,31,32,35,42,50,61,79,
+103,130,153,168,179,184,186,184,179,173,167,161,156,150,145,139,133,125,117,108,99,92,83,74,65,57,49,42,36,30,25,21,16,13,10,10,15,23,30,36,43,51,58,62,67,71,73,75,
+78,76,71,67,61,54,49,49,55,59,60,66,79,95,112,133,165,212,239,211,156,95,52,39,41,46,51,62,84,112,138,162,190,212,226,232,236,243,248,243,238,236,237,237,237,237,238,238,
+238,239,239,239,239,239,239,239,239,238,238,241,246,249,243,234,227,207,173,150,134,124,118,110,104,100,95,93,91,89,85,79,78,75,73,72,72,71,70,67,63,57,51,46,44,41,40,38,
+37,34,32,30,29,28,25,25,23,21,19,18,16,15,14,12,11,10,9,11,19,27,35,41,48,54,60,63,65,67,67,67,68,67,74,98,120,153,184,175,136,103,77,60,59,71,82,83,
+75,58,36,16,3,0,0,0,0,0,0,0,0,0,0,0,97,148,176,170,138,83,34,6,0,1,1,0,0,0,0,0,1,2,3,3,3,5,5,5,13,32,44,49,53,57,58,59,
+60,60,60,61,62,63,63,60,53,47,47,48,53,62,78,99,126,151,173,187,197,202,204,202,199,196,191,186,180,174,167,161,154,148,141,134,124,114,104,94,85,77,70,62,55,48,43,40,
+38,41,50,68,90,107,116,121,122,121,119,116,110,103,96,93,93,93,94,93,93,88,81,69,58,45,31,24,27,38,53,70,90,123,176,222,240,221,160,98,71,80,111,147,187,219,235,243,
+247,242,235,231,228,218,196,164,147,145,145,144,145,145,146,148,149,150,150,151,152,153,153,153,156,165,170,176,191,214,237,252,255,252,241,223,199,175,162,154,149,139,123,102,89,84,80,79,
+78,78,78,79,82,84,83,81,78,73,67,59,52,44,37,33,29,28,27,28,28,27,24,23,22,22,22,20,18,18,18,21,24,31,43,63,87,105,116,120,122,121,118,114,107,100,92,88,
+87,86,84,81,78,81,99,141,175,183,177,154,121,101,81,83,92,97,90,72,49,25,10,2,0,0,0,0,1,4,19,54,172,143,95,70,56,51,53,56,57,56,49,37,33,29,17,7,
+2,2,2,3,5,6,6,7,21,46,55,53,49,45,43,44,49,54,59,60,58,56,61,70,78,81,82,85,93,109,132,158,180,194,205,213,220,225,226,226,224,224,222,220,218,215,210,205,
+201,197,194,191,184,170,154,142,135,130,126,117,110,103,101,102,108,119,135,149,156,156,151,145,138,131,125,120,114,105,93,83,73,68,67,67,71,79,88,94,96,93,80,57,38,29,24,26,
+36,51,78,118,167,218,242,228,203,202,221,238,246,241,228,217,195,170,157,154,153,145,129,116,111,110,107,100,98,95,89,82,79,79,81,82,82,83,84,84,93,109,115,114,115,126,152,199,
+230,231,236,247,248,241,235,234,235,232,219,193,167,154,147,140,129,120,114,110,105,102,100,98,98,98,104,110,103,93,85,80,76,74,73,67,59,52,46,44,45,56,66,68,68,68,73,81,
+92,107,125,142,151,152,147,142,135,128,122,117,111,102,89,78,68,61,59,58,61,68,75,80,91,106,117,136,157,168,175,173,174,179,175,168,169,161,150,139,133,134,133,134,141,151,172,186,
+92,83,81,84,84,85,85,85,85,87,88,90,99,108,95,71,49,35,31,32,32,30,26,26,31,40,42,44,49,56,61,68,76,86,93,95,91,84,80,80,83,86,98,130,169,203,225,237,
+241,242,243,244,246,248,248,248,248,248,248,248,248,249,249,249,249,248,248,246,244,236,225,218,211,206,200,188,173,155,143,139,136,137,138,129,115,101,88,81,78,74,72,75,81,88,93,95,
+92,86,78,73,67,67,69,73,81,94,107,109,99,84,69,56,52,61,82,114,153,197,238,255,255,255,254,243,217,188,168,158,145,125,121,120,119,119,120,121,123,125,126,129,136,143,135,117,
+100,91,87,88,87,85,82,82,86,92,92,92,95,99,108,129,152,160,173,200,223,235,239,239,239,241,247,248,242,236,231,226,214,200,191,185,177,175,174,173,174,176,194,213,212,209,210,213,
+213,211,207,184,154,127,105,91,85,86,91,90,89,88,92,103,111,118,123,114,101,88,77,70,68,65,65,68,75,82,88,90,87,80,71,64,58,57,58,62,69,82,95,98,93,91,96,93,
+93,109,138,162,174,187,198,205,206,197,189,185,180,176,159,132,71,59,47,36,30,29,29,29,29,31,38,53,77,106,126,134,132,119,102,93,91,89,87,85,86,87,88,93,100,105,107,108,
+108,108,106,106,109,114,119,126,137,162,202,234,250,254,254,254,254,253,253,253,252,252,252,252,251,251,251,251,252,252,251,251,251,250,249,248,249,251,251,252,251,249,246,240,231,213,190,168,
+142,117,95,73,57,45,36,30,26,23,21,22,26,33,43,54,67,78,86,90,92,94,93,91,91,95,105,119,131,139,142,144,154,175,201,223,236,245,250,244,233,234,247,246,208,158,126,111,
+100,87,78,72,68,68,70,71,72,76,82,94,114,137,153,160,159,148,135,127,124,122,120,119,119,118,119,121,126,130,130,128,126,125,124,131,147,163,173,175,175,179,195,216,230,236,238,240,
+244,246,246,245,245,246,246,246,245,246,250,254,246,226,218,217,215,210,216,228,234,230,219,208,195,174,139,107,88,77,69,57,42,36,32,23,17,13,9,8,8,7,7,10,14,23,34,46,
+60,72,80,84,87,88,87,86,85,90,103,119,132,138,132,117,103,98,94,89,91,101,114,127,133,127,112,98,89,87,87,88,12,6,1,0,0,0,0,0,0,0,0,5,13,29,53,86,
+124,144,131,102,84,82,87,91,94,96,96,95,90,83,77,74,69,65,63,70,94,126,157,183,208,235,239,227,219,216,220,226,232,235,236,236,236,237,237,237,237,237,236,235,233,231,229,226,
+224,222,219,216,217,221,225,227,227,230,235,240,245,249,247,239,224,203,175,149,124,109,94,72,51,36,26,22,20,19,18,18,21,29,36,43,50,57,66,74,81,95,111,130,154,177,200,221,
+237,247,250,243,231,215,189,149,113,103,131,177,221,223,188,138,86,53,37,34,35,35,35,38,41,45,47,51,58,71,90,116,146,162,152,128,113,110,113,114,115,115,113,110,104,97,90,85,
+79,73,67,66,71,78,86,93,100,109,124,141,156,164,169,176,188,198,201,199,199,199,198,198,198,198,198,193,157,100,75,67,61,56,63,88,117,144,170,186,200,219,229,224,214,206,196,166,
+120,69,38,22,7,0,0,0,0,0,0,0,0,0,0,1,6,13,21,28,36,44,53,60,66,71,77,87,99,110,113,104,95,91,80,66,59,57,54,50,48,44,35,25,20,17,16,16,
+0,0,0,0,0,0,0,0,0,0,1,1,1,1,4,17,46,85,110,106,80,56,45,43,46,48,50,49,47,45,47,51,62,88,121,150,194,225,234,233,227,203,165,146,147,153,164,178,
+191,202,209,213,218,222,225,227,227,226,225,222,219,216,215,213,210,208,205,201,198,195,194,191,188,185,185,188,196,210,223,233,244,249,248,242,233,226,216,192,161,133,113,104,100,98,97,98,
+100,106,107,104,103,105,109,115,129,160,190,212,227,235,237,234,225,210,181,140,108,84,61,39,27,22,25,45,107,177,219,233,212,169,114,73,65,80,78,86,102,106,108,111,112,108,109,117,
+135,158,170,164,147,132,126,123,121,113,99,83,71,62,53,50,48,48,47,46,44,42,42,43,45,50,57,67,74,79,84,91,96,100,97,90,85,85,84,82,82,79,75,64,43,23,15,14,
+13,12,12,13,15,21,29,38,47,71,110,146,165,175,190,217,234,221,199,174,136,97,67,44,23,7,1,0,0,0,0,0,0,0,0,0,0,0,1,4,8,11,15,20,25,28,27,21,
+17,16,13,8,6,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,10,16,21,31,54,91,130,140,115,80,58,47,44,46,54,66,79,101,133,
+172,211,235,241,230,199,173,159,148,134,121,121,129,139,149,159,172,183,195,203,210,217,222,225,225,225,224,223,222,219,218,217,216,213,210,208,204,199,195,191,186,179,173,167,163,162,165,171,
+185,201,214,225,234,239,243,248,244,237,231,227,225,224,225,227,231,234,234,232,230,230,230,231,235,243,246,240,224,205,181,154,128,100,68,43,30,25,23,22,22,23,22,21,25,43,81,140,
+196,227,231,212,205,223,221,223,228,223,223,226,227,223,222,222,222,226,232,238,238,233,227,224,221,214,198,178,162,145,123,111,109,109,109,107,100,87,72,61,54,46,38,33,32,32,32,33,
+34,33,31,28,27,30,36,37,35,32,26,21,19,17,16,15,15,14,14,13,12,10,8,6,4,4,6,14,20,25,34,65,115,163,188,211,228,229,220,204,174,138,116,90,56,31,15,7,
+5,5,7,9,9,9,8,9,9,9,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,19,43,67,83,90,
+99,108,123,147,166,168,160,153,151,148,149,169,190,206,223,239,241,219,183,164,138,112,107,109,113,119,127,133,141,150,157,166,175,185,195,203,210,217,225,229,229,230,230,229,229,227,225,222,
+220,217,215,213,210,207,204,200,195,190,186,179,172,164,156,150,146,145,146,150,157,159,170,196,214,218,221,224,228,233,239,247,253,254,254,255,255,255,255,255,253,252,248,242,234,223,208,191,
+172,148,120,87,56,39,32,27,23,21,20,21,20,18,18,28,51,92,150,202,219,235,232,232,235,229,230,235,239,240,242,243,243,245,245,247,249,250,249,246,243,243,245,246,244,240,230,223,
+222,222,222,222,218,205,188,171,159,138,105,77,56,42,32,28,25,23,21,19,20,34,55,62,60,59,57,52,48,42,33,24,16,11,9,8,7,7,7,6,5,4,2,1,0,0,0,0,
+4,17,30,52,84,119,152,177,206,224,228,226,212,192,166,146,135,124,112,103,99,96,93,89,85,81,73,58,38,21,10,5,4,11,21,25,26,28,29,27,25,21,8,1,0,0,0,0,
+71,84,96,97,87,63,40,34,40,55,78,105,127,137,137,137,137,135,135,141,165,195,224,242,249,249,249,248,240,231,213,192,164,130,109,103,105,109,115,122,127,134,142,151,161,170,177,186,
+193,200,207,212,216,220,224,228,229,230,230,231,231,230,231,229,227,223,221,218,215,212,210,207,203,200,195,191,186,180,173,166,158,150,142,134,128,123,120,126,138,149,161,171,180,185,190,203,
+219,225,224,223,223,224,228,232,236,239,239,239,239,239,241,245,246,244,234,210,174,139,117,97,71,46,29,21,18,16,16,15,14,16,28,51,66,85,85,98,122,135,152,170,183,182,178,177,
+174,171,168,164,162,165,171,179,184,190,201,212,219,228,234,234,233,231,230,231,233,240,244,245,243,237,221,201,177,150,131,119,110,96,79,65,54,55,62,58,52,53,55,57,59,61,61,57,
+48,36,26,17,13,10,9,9,8,8,8,8,9,7,6,4,3,2,0,0,4,13,23,37,69,106,138,176,208,230,241,247,248,246,240,231,226,221,217,207,195,184,175,170,162,150,138,130,
+132,157,178,182,181,184,188,183,180,171,142,119,110,103,95,79,222,221,227,231,229,221,206,196,193,202,215,222,219,212,206,205,203,202,201,211,230,236,224,203,186,184,189,184,176,175,172,164,
+156,151,147,142,140,143,147,151,158,168,178,188,197,203,208,213,216,221,224,227,228,230,230,228,228,229,229,229,229,229,231,231,232,231,230,228,227,224,222,220,218,215,213,211,208,205,201,197,
+192,186,179,174,172,170,164,160,161,164,168,166,157,144,134,129,129,130,124,118,116,117,122,128,136,143,146,151,155,157,164,179,198,217,235,247,250,243,235,224,203,170,134,97,63,44,35,30,
+27,26,25,29,34,44,61,87,109,125,135,132,115,91,75,69,65,59,54,49,45,47,55,69,86,105,123,136,147,163,175,176,172,165,158,149,149,163,182,195,204,223,240,248,250,246,241,236,
+232,222,206,190,177,168,157,136,113,105,103,103,105,111,116,122,128,129,127,124,120,114,111,109,109,109,111,113,110,98,83,73,69,65,62,63,70,77,79,83,93,105,116,121,120,117,124,135,
+140,153,175,190,200,204,211,220,229,233,236,240,244,247,247,248,249,246,235,227,226,226,226,220,215,220,227,229,231,233,233,230,212,196,183,180,187,206,225,234,235,231,219,208,203,201,201,202,
+203,205,208,205,177,140,109,89,84,89,98,105,113,128,146,160,170,177,182,184,184,185,188,192,195,200,203,205,206,207,208,209,211,215,219,223,229,234,236,237,237,237,237,236,236,236,236,236,
+236,237,238,239,239,238,236,235,234,232,230,229,227,225,223,220,218,214,210,206,203,198,193,187,180,170,155,135,117,102,93,86,80,75,73,71,69,70,71,71,72,74,75,77,80,82,86,93,
+104,122,147,180,208,226,236,244,253,253,244,226,197,172,155,136,117,104,98,99,107,116,125,129,122,109,90,65,42,27,21,20,21,20,20,20,21,21,22,22,26,33,42,49,59,76,97,115,
+124,130,133,132,129,130,135,141,148,164,184,205,224,236,245,249,251,252,252,251,250,250,250,245,236,232,229,229,229,228,229,230,231,234,237,240,241,240,238,237,237,237,238,237,233,222,204,186,
+176,166,154,145,139,129,121,115,108,97,79,54,33,17,10,7,7,10,18,27,34,38,44,57,75,95,112,118,124,132,139,146,150,139,130,132,135,137,141,139,137,142,153,161,166,172,188,212,
+126,119,115,113,112,112,108,94,83,72,57,48,46,50,53,58,62,69,75,78,70,64,68,74,79,83,86,90,93,99,108,119,130,141,153,165,172,175,179,183,184,184,183,181,182,184,187,190,
+193,198,202,207,213,221,227,233,238,241,241,239,240,239,239,240,240,239,238,238,237,234,232,231,230,229,227,223,220,218,215,212,208,205,200,195,188,179,172,163,152,140,127,115,106,100,96,92,
+90,87,86,85,84,84,84,84,83,83,83,81,81,79,76,74,72,72,74,84,99,115,130,149,178,209,233,249,254,252,248,238,221,204,183,157,131,112,93,68,48,33,22,15,13,15,15,16,
+17,17,17,18,19,19,19,18,18,18,17,17,19,21,28,39,49,59,74,89,100,109,122,133,146,159,177,202,222,234,242,246,248,249,248,247,247,249,249,247,245,246,245,244,244,244,243,244,
+245,244,243,241,240,237,235,234,234,234,234,233,237,244,246,241,238,233,222,210,197,174,149,121,98,90,77,54,31,18,18,29,54,83,98,98,98,94,77,48,22,3,0,0,0,0,2,7,
+12,17,28,39,44,48,58,69,79,89,101,111,114,116,129,139,43,44,44,39,31,21,10,1,0,0,0,1,4,8,12,18,25,33,41,49,58,67,74,80,84,88,91,94,97,100,103,107,
+111,116,123,130,137,141,146,151,155,158,162,166,171,175,180,183,189,194,198,202,206,210,215,220,225,230,231,231,231,232,231,232,232,231,228,227,225,223,222,220,219,217,217,214,211,208,206,203,
+199,195,189,184,178,171,163,156,148,140,133,126,120,114,110,106,103,102,99,99,98,97,97,96,96,95,95,94,93,91,89,86,82,76,69,62,56,51,48,48,57,77,108,148,182,203,220,236,
+244,246,239,216,173,129,93,64,44,29,20,16,15,15,15,16,15,15,15,15,16,16,16,17,17,17,16,16,16,15,14,15,19,31,51,80,114,151,184,203,217,230,240,243,237,229,218,202,
+186,176,160,147,144,144,141,130,124,128,127,124,122,123,122,125,128,125,120,117,116,117,127,140,154,161,163,164,174,194,215,226,233,237,241,243,243,240,233,219,209,212,212,202,187,171,167,181,
+200,218,230,226,221,223,225,211,178,124,94,76,47,22,8,0,0,0,0,0,0,0,2,5,10,16,27,38,44,44,44,43,5,5,5,5,2,1,1,3,4,5,7,10,13,17,21,26,
+33,41,49,58,66,72,79,86,91,93,96,99,101,103,107,110,115,119,123,127,131,136,140,145,150,155,161,167,172,176,180,184,189,193,198,202,205,209,212,214,218,220,221,224,224,225,224,225,
+225,224,223,221,220,220,220,219,217,217,216,215,213,210,207,205,202,199,194,190,184,179,172,165,158,152,144,138,132,126,122,118,115,113,111,110,109,109,108,108,107,106,106,105,103,102,100,98,
+94,87,80,73,65,55,48,39,30,24,23,32,47,64,88,118,151,185,217,239,241,229,212,194,174,150,126,108,99,98,98,96,92,90,90,90,90,90,90,91,91,91,91,90,90,90,90,95,
+111,142,175,203,226,240,244,240,231,219,200,170,135,111,92,72,57,48,38,29,24,23,21,17,17,15,12,9,8,11,13,15,21,34,50,73,95,120,157,186,203,214,215,215,217,221,226,231,
+234,237,241,244,246,248,250,252,252,253,254,255,255,255,255,247,225,195,155,109,85,93,125,170,209,230,231,226,209,177,141,101,55,19,3,1,1,1,1,0,0,0,0,0,0,3,5,5,
+58,58,58,58,58,58,58,60,61,63,64,66,69,72,75,79,85,91,97,104,109,114,121,128,132,130,129,131,133,134,137,140,143,147,149,148,148,151,155,159,163,167,171,176,180,184,190,197,
+202,206,210,213,214,216,219,222,224,224,224,225,225,224,225,225,225,224,223,223,220,220,220,219,217,216,215,215,214,212,209,207,205,203,199,194,190,184,178,172,165,158,152,146,140,134,130,127,
+124,122,120,119,119,118,118,117,117,116,115,115,113,111,108,106,104,100,96,92,88,84,81,74,66,58,54,50,51,58,66,72,83,102,134,174,208,228,240,247,248,246,241,235,231,230,230,229,
+227,226,225,225,226,225,226,227,227,226,226,226,226,226,226,228,236,246,250,245,230,210,182,155,135,115,95,74,59,53,56,64,68,70,74,73,67,63,63,65,62,53,47,51,61,79,93,102,
+118,149,179,204,221,232,241,240,233,228,226,226,226,226,226,225,225,225,225,225,225,226,227,229,231,229,219,210,201,187,163,122,76,42,18,3,0,0,5,20,54,98,120,144,180,212,238,238,
+213,164,111,81,70,63,58,51,43,39,38,38,42,51,57,58,140,140,140,140,140,139,137,132,126,122,121,123,125,127,130,132,136,141,145,149,153,156,161,165,162,150,145,146,147,148,150,152,
+154,157,158,150,144,146,150,154,158,161,166,170,174,179,187,198,205,209,215,221,223,224,226,229,232,232,233,233,232,232,233,234,233,232,229,229,228,225,223,222,220,218,216,215,214,212,210,208,
+206,204,201,197,192,188,182,175,169,163,157,151,145,140,137,133,130,128,127,126,125,125,125,124,124,123,123,122,120,118,114,111,109,108,108,106,107,109,111,112,113,112,114,115,117,122,122,120,
+119,120,122,131,145,161,178,193,206,219,231,238,242,243,243,243,245,245,245,245,245,245,245,246,244,241,240,240,240,240,240,240,233,219,194,157,119,91,71,59,52,49,47,46,45,49,64,85,
+96,102,113,123,124,120,121,130,142,153,166,186,207,224,233,236,242,248,249,244,233,221,196,162,132,113,102,98,97,95,95,95,96,96,97,97,97,97,98,100,102,94,75,60,47,30,13,1,
+0,0,0,0,0,0,0,0,0,0,2,10,25,55,128,209,242,252,240,219,203,189,176,158,142,135,133,131,129,131,135,138,199,199,199,199,199,199,193,177,148,117,92,80,76,77,80,83,
+88,93,99,104,110,115,120,122,117,107,103,104,105,107,109,111,114,117,117,115,114,118,122,126,131,136,141,146,150,155,163,171,176,181,189,197,202,206,209,213,217,222,225,228,232,233,235,238,
+239,239,237,236,235,235,233,231,231,228,225,223,220,216,212,208,205,202,200,197,193,187,182,177,171,165,159,154,148,144,141,137,135,133,131,130,130,129,129,129,128,127,126,125,124,121,118,113,
+111,108,102,98,94,89,87,88,91,92,92,92,91,84,75,70,70,70,69,68,69,71,75,80,88,98,110,121,127,130,130,130,133,136,136,135,136,136,136,136,129,119,115,114,114,114,115,113,
+101,81,58,33,17,12,11,10,10,10,10,10,10,11,17,27,34,37,46,61,75,95,127,159,196,226,242,251,254,249,243,240,238,226,206,185,167,155,138,118,105,92,77,66,56,38,21,10,
+5,2,3,4,4,4,4,5,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,106,147,162,187,209,223,234,239,233,220,211,208,206,202,198,196,198,
+56,57,56,55,56,55,50,46,40,32,24,18,16,17,20,24,30,36,44,50,57,63,68,72,74,74,74,76,77,78,79,83,85,88,91,94,98,103,106,110,115,119,124,129,134,139,143,148,
+153,157,162,168,173,178,182,188,192,198,202,207,212,217,220,223,227,227,226,226,226,228,229,230,232,235,236,235,234,231,225,219,212,205,199,194,190,185,181,175,169,164,159,153,149,144,141,138,
+136,134,133,132,131,131,130,130,129,128,128,126,125,122,119,115,110,103,95,86,77,66,57,49,44,38,32,28,24,18,13,10,8,8,7,7,7,7,6,7,7,7,9,11,12,13,12,13,
+14,15,15,14,14,15,15,15,12,9,8,8,8,8,8,8,5,1,0,0,0,1,1,1,1,0,0,0,0,2,2,2,2,7,22,53,101,162,210,232,243,238,220,196,166,138,119,115,
+117,106,87,77,79,87,97,109,123,137,145,144,138,122,97,71,47,24,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,22,46,
+42,25,31,50,73,100,109,92,76,68,65,68,84,93,79,62,0,0,0,0,0,0,0,0,0,0,0,3,6,10,14,19,24,32,41,48,53,59,64,67,70,72,73,73,73,74,75,76,
+78,80,83,86,89,92,96,100,104,108,113,118,122,126,130,135,140,144,149,154,158,163,169,174,178,184,188,192,196,200,204,207,210,212,214,217,218,219,221,224,227,230,233,234,233,234,234,231,
+226,220,210,199,190,183,176,171,166,161,155,150,145,142,139,136,134,133,131,130,130,130,129,129,128,127,126,125,124,121,117,113,107,100,92,83,73,63,53,43,34,26,19,15,10,6,4,3,
+1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,3,3,3,4,7,9,9,9,9,9,10,10,11,11,10,13,21,29,32,35,39,47,62,77,83,
+86,100,140,185,221,241,235,216,185,136,89,55,28,13,9,10,15,19,23,34,46,57,70,87,106,126,142,148,151,154,151,139,127,104,69,35,13,2,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,2,9,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,6,12,18,22,24,25,31,39,45,47,49,52,56,60,
+65,75,86,92,95,99,102,104,107,109,110,110,111,110,110,111,112,112,114,116,117,120,122,126,128,131,134,137,141,144,147,151,153,157,161,164,169,173,177,181,186,190,193,196,198,201,206,211,
+214,218,221,223,224,223,221,218,217,215,214,212,212,212,212,213,216,221,221,214,204,193,178,167,159,153,149,145,140,137,134,131,130,128,127,127,126,126,125,125,124,124,123,121,120,116,112,108,
+103,96,88,80,70,60,51,42,33,25,19,13,8,5,4,3,5,5,6,12,18,23,26,32,48,72,100,115,117,117,117,117,118,121,116,97,82,80,81,81,81,81,91,112,122,120,118,119,
+119,118,119,118,117,115,125,150,169,175,177,184,194,207,220,224,225,231,244,249,239,211,165,127,100,77,62,51,42,42,50,58,64,76,91,100,101,96,90,85,81,74,70,69,72,76,79,86,
+102,122,127,111,83,54,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+59,62,70,83,94,100,101,103,108,115,118,120,121,123,124,125,126,127,129,129,128,129,130,132,136,141,145,148,149,150,150,150,151,150,151,151,152,153,155,157,159,160,162,164,166,168,170,171,
+173,174,177,179,182,185,188,192,195,200,204,207,209,213,219,224,224,225,223,219,213,208,203,199,195,192,190,189,188,186,185,185,187,192,200,207,211,208,198,182,163,148,140,135,131,128,126,124,
+123,122,121,120,120,119,119,118,117,116,116,114,112,109,105,100,95,90,82,74,65,55,47,38,29,22,20,22,27,34,41,50,60,63,68,80,97,123,151,175,203,226,242,246,246,245,246,246,
+246,247,246,236,222,220,220,219,220,220,227,240,244,240,239,239,239,239,239,238,238,236,240,250,254,255,255,255,255,252,248,245,245,242,229,205,178,149,128,119,118,118,118,118,116,118,132,140,
+135,134,127,105,81,61,44,30,20,11,7,4,4,5,6,10,21,46,79,109,123,122,103,68,32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,3,10,20,29,39,48,121,120,121,118,112,106,106,106,103,98,97,100,103,107,110,113,115,114,113,114,117,119,119,119,118,117,117,116,113,111,107,105,
+104,103,102,102,103,104,106,107,109,112,114,115,118,122,127,133,139,146,153,158,162,165,169,173,173,168,170,178,186,192,198,201,199,198,195,189,186,184,182,180,178,177,175,173,172,172,170,169,
+166,164,166,170,178,186,194,196,186,167,149,134,123,116,114,113,112,111,110,111,110,110,110,109,108,107,107,105,102,100,96,91,87,80,73,65,57,49,43,38,43,54,68,84,98,107,114,118,
+118,117,125,154,194,230,246,242,227,206,179,161,159,158,158,158,157,154,164,197,211,210,210,210,210,210,220,237,240,235,233,232,233,233,234,234,233,227,223,217,199,190,187,180,171,157,141,134,
+132,126,108,87,73,67,66,66,67,67,70,78,85,91,100,101,85,70,52,28,11,4,0,0,0,0,0,0,0,0,0,0,0,0,9,32,58,87,114,124,106,73,41,19,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,7,20,41,61,80,97,107,114,119,70,67,61,49,37,32,37,47,56,59,63,69,77,84,90,98,
+108,120,130,139,146,148,147,142,135,124,113,104,95,87,79,70,60,50,44,42,43,44,44,46,49,51,53,57,62,72,89,113,143,170,189,200,203,204,205,208,208,199,193,197,199,197,190,183,
+173,165,163,163,165,167,168,167,168,168,166,164,163,162,160,159,156,152,148,145,140,141,149,164,177,182,175,162,145,130,117,106,101,98,96,96,95,95,95,96,96,95,94,93,91,88,85,80,
+77,71,66,63,63,67,73,82,98,114,120,120,114,104,93,80,83,128,183,227,231,196,146,115,91,72,57,49,49,45,39,30,22,16,15,32,43,44,44,43,43,45,63,98,115,113,112,111,
+107,102,99,98,97,90,82,71,51,42,39,34,28,21,14,12,11,10,7,4,3,4,4,4,4,4,5,9,12,15,18,16,9,3,0,0,0,0,0,3,8,11,12,12,12,12,12,12,
+12,12,9,6,6,16,41,78,111,123,115,93,66,43,23,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,12,23,38,54,72,95,114,121,121,114,104,93,84,
+5,3,1,2,9,28,51,73,88,96,103,112,119,127,135,142,151,158,158,154,150,151,157,164,168,164,153,144,137,131,124,113,97,77,56,38,30,28,28,29,31,34,36,38,40,44,48,55,
+65,78,89,99,104,108,111,116,126,152,175,183,185,191,203,213,215,205,191,178,170,166,168,174,181,184,183,183,181,178,173,170,172,177,179,176,170,168,168,171,179,189,199,204,203,197,188,177,
+166,155,144,133,118,107,98,91,85,83,82,82,81,79,78,80,84,87,89,96,103,112,116,118,113,97,77,58,40,25,20,59,147,220,226,180,107,63,54,65,75,79,80,80,80,78,73,61,
+46,31,17,6,0,0,0,0,10,25,40,55,68,73,75,73,64,47,28,11,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,13,26,35,39,41,48,63,81,91,93,93,91,87,79,74,72,71,68,60,45,28,15,17,38,69,98,118,123,115,99,73,49,32,24,20,15,11,5,3,3,3,3,3,4,7,13,25,
+41,56,68,82,99,113,120,121,114,95,73,54,38,25,17,11,0,5,16,37,63,84,93,91,84,85,95,110,126,142,158,165,154,121,83,58,47,47,57,81,118,154,172,172,162,149,136,126,
+121,117,105,82,56,36,24,21,21,24,26,27,29,29,31,33,35,35,38,40,43,48,53,58,63,70,79,87,96,108,131,160,187,209,225,231,227,217,212,210,208,208,209,211,215,221,217,213,
+219,224,227,230,235,240,243,241,238,237,237,240,243,245,247,248,248,246,243,237,225,213,199,176,155,137,117,101,97,98,104,113,123,129,131,127,117,103,88,75,56,33,15,4,4,25,94,191,
+231,181,105,64,61,76,86,81,70,63,62,63,65,70,80,93,102,106,101,83,64,54,50,56,73,85,88,86,81,76,74,77,82,87,80,59,32,12,1,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,7,22,42,60,75,84,87,87,89,100,122,139,144,145,146,148,145,130,111,93,82,80,85,89,85,69,46,28,21,29,50,75,98,116,123,
+118,108,103,102,97,83,69,63,61,61,61,62,66,76,93,113,133,143,145,138,123,103,84,67,47,24,8,0,0,0,0,0,49,61,76,88,89,77,59,49,49,62,83,107,129,149,162,147,
+92,34,8,5,5,6,8,10,29,81,141,168,160,136,111,91,81,82,95,105,101,85,62,43,28,21,19,19,20,20,22,23,27,31,34,36,38,39,42,47,51,58,67,82,101,122,139,147,
+150,149,149,159,177,195,205,218,225,224,224,223,220,214,214,214,199,178,162,159,165,173,183,191,190,183,177,174,175,179,185,189,190,194,201,216,230,236,243,249,247,239,219,185,164,152,137,129,
+129,130,129,120,102,82,66,57,50,44,46,76,125,178,228,224,155,88,73,83,86,72,52,36,28,29,37,46,51,57,68,89,112,133,141,128,114,107,100,90,79,61,45,33,23,17,15,18,
+29,47,72,88,87,72,49,29,13,5,2,0,0,0,0,0,1,3,4,5,4,2,0,0,0,1,7,19,37,60,81,89,87,78,63,50,45,45,52,66,73,74,74,75,84,100,109,106,
+90,68,50,42,48,64,81,89,82,64,48,46,53,67,85,100,106,108,111,123,131,125,120,119,120,119,119,121,126,132,135,141,144,146,144,129,103,77,60,51,44,38,33,28,25,25,27,34,
+106,104,97,86,72,63,62,72,87,103,120,136,151,163,163,124,51,5,2,6,6,7,7,6,6,38,109,157,158,134,106,80,58,43,42,54,73,90,97,92,81,67,58,53,52,52,53,55,
+61,69,73,74,75,71,69,70,75,88,107,120,127,127,119,108,99,92,89,86,88,93,98,109,122,123,119,114,106,100,110,124,134,138,131,113,94,82,82,94,108,119,122,121,119,120,123,127,
+124,115,104,101,108,114,128,151,171,196,228,241,238,230,202,167,149,138,126,119,118,119,119,122,133,153,181,223,244,235,198,144,108,101,98,86,70,59,54,59,68,76,82,86,87,87,87,87,
+85,83,74,60,54,54,50,36,19,7,1,0,0,0,0,0,0,2,14,36,61,81,89,85,73,59,49,43,41,41,41,42,47,54,57,58,56,50,44,42,44,55,73,85,90,86,70,49,
+30,17,7,2,1,1,1,4,5,5,5,5,9,21,42,65,85,93,86,65,41,27,30,47,67,84,88,87,87,88,92,95,93,81,64,55,55,55,60,65,67,69,73,80,88,88,81,75,
+76,83,93,99,102,101,98,96,97,97,96,95,94,95,99,105,116,108,98,92,90,91,93,94,95,98,102,110,126,143,151,129,70,17,0,0,2,2,1,2,12,58,123,158,151,126,99,74,
+53,37,24,17,19,31,49,67,81,90,92,93,93,94,94,94,94,94,94,95,96,100,108,122,129,141,154,143,113,83,62,55,57,61,64,67,68,69,68,66,64,62,59,58,60,67,78,91,
+109,127,143,151,141,117,87,67,60,65,72,73,73,73,76,88,103,112,105,81,59,51,51,54,65,87,125,164,186,211,233,239,238,233,222,212,213,218,221,227,236,244,245,228,187,157,135,124,
+120,115,106,96,88,88,87,85,79,71,62,52,46,44,39,31,22,14,7,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,7,22,42,63,77,85,87,88,88,88,88,88,
+88,86,85,85,85,86,94,107,112,122,134,120,83,42,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,27,46,69,94,116,126,115,87,53,30,23,31,41,44,44,44,48,61,
+80,91,84,57,31,20,21,23,30,44,59,71,81,82,79,78,78,80,86,94,102,108,108,107,109,110,116,121,124,127,131,130,77,75,71,64,56,49,44,39,37,40,49,64,86,110,132,143,
+127,88,48,26,17,16,24,43,80,126,152,149,131,105,81,60,43,29,20,14,8,5,6,10,20,31,40,46,48,48,48,48,42,37,35,35,38,45,61,83,90,97,112,120,110,86,62,49,
+44,44,46,48,50,50,50,50,49,51,57,70,86,101,110,113,115,119,129,143,156,154,137,116,91,64,44,36,32,30,29,35,50,73,101,119,118,106,96,89,91,95,94,91,90,100,122,147,
+162,177,200,213,216,214,212,205,191,169,146,121,99,96,95,92,87,81,76,68,55,46,37,29,19,12,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,7,18,28,37,42,44,44,44,44,38,32,29,28,28,35,51,78,95,109,125,128,113,85,59,44,38,36,31,22,13,1,0,0,0,0,10,28,49,68,81,86,
+89,94,107,125,141,139,120,97,69,40,19,10,6,3,3,9,26,54,86,106,105,92,81,75,79,87,87,83,77,74,74,74,74,74,74,75,78,84,89,89,90,90,92,94,95,95,91,84,
+18,18,17,14,10,9,9,10,14,20,30,43,60,79,101,121,137,142,135,123,114,115,123,136,148,149,137,119,97,77,58,43,30,20,14,9,6,4,2,0,0,0,1,2,2,3,3,3,
+2,1,2,3,4,5,9,15,19,23,34,57,85,103,103,91,75,62,54,49,48,48,52,57,62,74,92,105,109,102,89,77,69,66,68,74,84,91,100,115,128,116,91,76,69,62,57,56,
+60,73,96,128,142,130,105,89,80,67,51,39,31,27,26,28,30,35,46,55,58,58,57,52,42,33,28,26,27,27,25,21,19,18,18,15,9,6,3,1,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,105,132,136,156,171,177,182,190,200,206,204,199,
+191,185,179,172,162,134,94,65,47,47,63,78,84,79,67,55,47,45,47,55,67,76,86,104,118,104,77,62,54,46,42,41,45,58,85,120,136,123,97,80,71,57,39,26,18,15,15,15,
+15,15,15,15,17,22,27,27,27,27,27,27,27,26,23,19,44,50,55,59,59,60,62,63,62,60,58,61,69,76,82,88,97,110,121,128,132,134,133,129,119,106,92,77,62,48,36,25,
+17,12,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,3,3,3,3,5,7,9,13,27,52,76,93,103,110,114,112,108,102,99,101,103,104,97,80,59,40,27,22,
+19,17,17,18,19,20,26,42,71,88,90,91,93,95,97,99,99,97,95,89,78,58,39,27,21,15,10,8,8,10,8,7,5,4,2,0,0,0,0,0,0,0,1,6,13,24,34,38,
+43,48,55,58,59,59,59,58,55,48,41,39,38,36,30,20,11,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,22,113,135,125,102,79,58,53,54,62,80,100,115,125,132,140,149,159,181,199,203,197,183,157,111,64,33,6,0,0,0,0,2,4,6,12,31,61,79,82,83,85,88,90,91,
+91,89,87,82,69,50,28,16,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,13,24,34,39,131,134,138,140,140,140,141,142,140,137,134,132,131,128,119,106,
+94,88,86,85,82,79,76,72,66,59,51,42,33,26,19,14,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,4,4,6,6,7,11,19,33,
+53,81,111,137,151,143,122,109,101,88,68,49,33,21,13,11,9,8,7,6,7,7,6,6,10,18,27,37,51,69,86,95,94,87,77,67,56,46,30,16,11,12,15,14,10,6,6,5,
+5,5,6,7,11,14,21,30,38,44,55,72,90,108,120,125,128,133,137,140,140,140,140,140,138,134,128,126,126,124,117,102,85,69,53,35,19,6,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,17,38,65,96,124,138,133,121,124,143,160,178,187,175,156,105,48,
+17,0,0,0,0,0,0,0,2,11,20,30,45,64,81,90,88,81,71,61,51,39,23,8,3,5,8,7,2,0,0,0,0,0,1,3,7,12,19,29,36,43,55,71,89,108,121,127,
+124,120,115,112,112,112,112,112,117,124,130,132,133,134,137,138,131,122,114,105,93,77,60,46,35,27,22,19,16,13,9,7,5,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,2,2,2,4,4,5,6,6,10,18,36,62,92,110,112,112,110,99,90,86,80,70,58,45,33,22,16,12,10,10,9,10,13,20,32,49,67,83,93,94,
+94,95,98,103,110,116,108,89,77,80,87,81,61,44,41,41,44,48,57,68,79,90,103,116,125,130,138,145,147,144,136,132,129,125,117,112,112,112,112,112,116,123,128,130,131,135,143,151,
+152,146,138,124,102,73,43,21,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,9,26,53,84,103,104,102,100,91,92,111,132,149,180,191,174,137,86,47,27,14,2,2,7,15,28,46,65,81,90,92,91,92,95,100,107,113,106,86,74,76,84,78,58,43,41,42,
+44,49,58,69,80,91,103,116,124,129,136,142,144,141,133,127,44,33,26,23,24,25,25,25,29,36,48,63,78,91,107,126,139,142,141,140,139,132,118,98,74,48,26,12,6,3,3,2,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,3,3,3,3,3,7,18,39,58,73,77,71,66,68,74,84,89,89,
+87,79,72,65,60,59,59,64,70,78,85,89,85,72,59,55,65,85,108,128,145,156,160,157,154,154,156,154,142,129,125,125,127,131,136,141,144,144,144,138,131,126,117,102,86,68,52,44,
+40,34,28,25,25,25,25,25,28,36,48,61,76,90,106,129,149,157,159,160,160,152,133,106,75,43,19,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,33,53,68,73,66,60,60,66,75,92,119,146,176,197,197,189,171,128,91,75,72,78,84,79,67,54,50,
+60,81,105,125,141,153,156,156,155,158,163,166,164,160,161,162,163,167,171,175,178,179,179,177,174,171,163,150,125,97,74,60,106,64,28,9,0,0,0,0,3,20,47,73,88,92,95,98,
+102,107,113,118,125,134,141,146,143,126,97,64,35,14,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,9,11,11,11,11,11,11,12,12,12,11,8,6,
+5,3,3,3,1,2,4,9,12,10,9,10,15,24,36,47,60,71,77,83,85,85,84,83,78,71,61,47,34,28,34,55,89,122,143,151,151,145,138,130,121,120,128,134,134,131,132,132,
+130,126,118,109,98,89,82,74,66,59,49,34,19,8,1,0,0,0,0,0,0,0,0,0,4,20,47,74,87,92,95,98,103,109,116,123,131,142,150,154,149,129,98,63,33,13,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,9,11,11,11,11,11,11,11,11,11,9,6,3,2,0,0,0,0,0,1,6,9,8,6,7,13,22,33,43,
+54,70,89,113,133,162,196,206,195,157,112,80,67,60,64,80,108,136,155,163,167,168,172,184,195,203,210,221,232,239,242,241,241,240,239,238,236,234,232,229,227,226,223,216,198,175,159,140,
+232,203,164,122,78,49,39,45,65,84,92,83,65,50,42,35,29,28,30,32,39,51,65,85,114,142,153,143,122,88,56,40,31,25,22,21,21,21,21,21,21,23,27,34,38,42,50,58,
+62,64,69,78,82,82,82,82,82,82,82,83,83,79,71,64,60,53,48,51,47,32,14,3,0,0,0,0,0,0,0,0,5,11,16,23,27,28,28,26,23,23,26,32,47,73,104,131,
+146,141,122,100,83,66,50,38,30,30,42,54,64,75,85,89,88,84,77,69,63,64,71,77,77,75,72,64,52,42,34,22,12,12,12,12,12,13,20,38,65,87,93,84,65,50,42,35,
+29,28,28,31,38,51,65,86,116,144,154,144,122,88,57,40,31,25,22,21,21,21,21,21,21,23,27,34,38,42,50,58,62,64,69,78,82,82,82,82,82,82,82,82,82,79,70,63,
+59,51,47,50,46,30,13,1,0,0,0,0,0,0,0,0,4,10,14,19,22,26,41,68,111,160,185,183,187,195,206,216,221,222,222,223,226,229,233,240,244,246,247,248,247,241,236,237,
+237,236,236,235,234,235,237,238,238,238,238,240,244,246,245,242,233,247,250,241,220,198,182,170,153,118,69,27,6,0,0,0,0,0,0,0,0,0,12,35,68,108,145,158,160,156,143,130,
+120,111,107,106,106,106,106,106,107,108,114,122,126,132,141,146,139,126,121,119,117,117,117,117,117,117,117,117,117,118,120,120,120,120,125,132,130,114,87,58,37,24,14,7,2,0,0,0,
+0,0,0,0,1,5,15,30,49,71,93,113,131,144,145,131,103,66,36,18,9,3,0,1,11,27,45,60,76,86,89,90,90,89,88,87,87,88,85,78,74,74,76,82,87,88,88,82,
+72,72,74,78,86,93,104,117,123,103,63,27,9,2,0,0,0,0,0,0,0,0,12,35,68,108,145,158,160,156,143,130,120,111,107,105,105,105,105,105,105,106,112,119,124,130,139,144,
+137,123,118,116,114,114,115,114,115,115,116,116,116,117,119,119,119,120,126,135,132,116,89,60,39,26,16,9,4,2,1,1,1,1,0,0,1,4,12,25,45,78,122,150,162,171,175,177,
+181,193,215,236,247,247,241,224,204,195,193,189,177,161,154,153,152,152,152,150,151,151,147,142,139,139,140,151,172,189,199,212,151,183,214,237,251,255,254,245,220,172,110,56,26,14,6,0,
+0,0,0,0,10,31,56,75,87,94,99,101,105,117,129,134,137,140,141,141,141,141,141,141,141,141,138,134,131,133,136,130,105,76,61,52,47,46,46,46,45,44,42,41,41,46,54,60,
+64,78,107,132,146,160,163,154,141,128,114,102,91,85,83,78,69,61,58,56,57,67,89,115,136,151,158,160,155,125,84,52,24,5,0,0,0,9,25,45,66,82,87,85,76,65,58,59,
+62,63,63,63,61,52,36,22,19,20,27,40,57,68,77,90,98,104,115,129,143,142,130,107,74,36,9,0,0,0,0,0,0,0,0,1,11,32,57,76,88,94,100,101,106,117,129,133,
+135,138,139,140,140,141,142,145,149,150,148,144,142,144,146,142,120,94,82,73,67,67,67,63,59,54,48,45,46,54,62,66,69,81,101,116,127,141,148,140,126,113,96,81,69,62,60,59,
+60,60,60,59,60,69,90,115,134,146,153,158,165,168,181,200,218,233,239,231,206,179,156,129,113,111,110,100,85,69,61,62,65,67,67,66,63,55,40,28,24,26,32,47,69,85,99,119,
+118,137,158,172,179,184,198,220,237,240,226,193,159,132,104,69,45,39,43,56,74,91,91,77,58,42,29,20,19,28,38,46,54,61,65,66,65,65,65,65,64,62,56,47,42,41,42,37,
+21,6,1,0,0,0,0,0,0,6,18,28,36,37,40,62,95,119,161,183,187,197,208,218,222,224,226,225,224,223,223,221,213,201,183,168,163,160,157,147,133,122,125,133,128,100,70,49,
+36,28,30,38,49,67,83,88,81,65,46,33,29,38,54,69,76,78,78,77,72,61,48,41,41,46,57,72,86,94,97,104,115,128,138,135,116,83,52,27,7,0,0,0,0,0,0,0,
+2,12,29,49,73,90,90,76,57,40,26,17,18,28,42,57,76,96,114,129,134,138,148,164,179,184,181,178,175,175,175,173,165,157,155,153,152,152,151,144,134,115,90,76,74,81,85,78,
+62,48,43,42,48,66,94,117,130,139,143,143,141,139,138,138,138,138,137,137,139,145,151,152,154,164,180,200,216,232,244,245,233,213,184,144,110,97,95,90,80,63,44,31,27,36,53,68,
+75,77,77,76,71,60,47,40,40,45,55,70,85,92,96,102,119,131,137,128,105,84,83,105,144,188,226,243,245,241,232,212,194,187,182,176,168,156,140,117,93,87,87,83,79,78,77,78,
+79,80,81,81,81,81,81,79,74,68,58,42,28,23,22,20,16,11,5,1,1,8,26,57,97,145,164,169,172,173,173,173,160,146,108,69,57,56,63,75,85,97,110,120,129,133,135,141,
+156,174,196,206,210,211,200,173,137,98,67,59,71,81,89,91,89,85,85,87,88,82,65,45,27,15,16,31,56,80,89,84,78,75,75,77,81,87,89,88,87,88,86,85,88,92,96,103,
+119,133,139,127,96,61,37,22,13,12,13,14,18,27,36,49,64,89,116,131,129,110,86,68,60,57,58,59,67,81,96,124,159,182,201,216,221,223,229,237,241,242,242,242,242,241,241,241,
+241,241,242,242,242,242,243,242,241,235,226,222,222,222,220,213,197,174,149,127,109,89,74,72,81,94,104,112,119,123,125,126,126,127,131,141,155,171,179,182,194,213,230,242,248,240,219,189,
+156,128,108,94,87,80,64,44,27,15,16,31,56,80,89,84,78,75,75,77,81,87,89,88,87,87,86,85,88,92,96,102,42,52,65,80,87,86,84,82,88,110,145,179,203,222,240,250,
+254,254,251,246,241,237,237,232,223,225,228,228,224,222,219,219,218,216,216,216,215,214,215,215,210,207,199,181,163,157,157,155,153,142,131,129,142,166,186,196,184,144,113,88,69,60,57,40,
+18,9,0,0,0,0,0,0,2,8,14,21,26,30,32,33,37,44,56,66,81,101,122,145,162,162,135,95,64,48,47,54,61,65,62,57,49,37,25,24,33,48,68,85,88,73,48,26,
+17,15,15,16,22,32,41,44,44,40,32,23,20,21,24,29,42,52,65,80,88,88,86,80,75,73,72,75,83,101,118,130,141,153,158,155,146,144,155,167,179,194,204,210,215,224,229,238,
+243,242,235,226,221,219,212,196,178,170,170,170,171,173,177,181,185,189,189,189,189,190,191,195,200,211,226,238,243,245,248,252,252,250,247,242,233,219,199,185,185,186,180,174,170,170,169,169,
+169,172,182,198,216,231,238,242,243,235,221,203,174,131,91,71,65,64,61,55,48,37,25,24,33,48,68,85,88,73,48,26,17,15,15,16,22,32,41,44,44,40,32,23,20,21,24,29,
+0,0,5,15,29,42,56,67,73,74,78,85,99,121,146,170,192,216,237,248,252,254,255,255,251,246,244,244,245,245,244,244,244,241,240,239,237,235,234,234,237,244,249,250,250,252,253,255,
+255,253,252,253,253,246,229,203,177,151,134,117,91,69,59,55,53,53,53,53,47,42,41,46,53,56,57,57,57,57,57,60,66,71,71,72,82,87,83,85,96,106,109,102,87,68,54,54,
+59,63,66,71,75,77,80,84,88,88,81,64,39,16,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,15,29,43,56,68,75,76,75,74,79,94,104,104,
+98,96,93,94,127,194,233,244,249,252,253,252,249,245,240,229,210,188,166,144,130,121,109,92,77,72,71,72,79,94,110,122,129,132,133,133,133,133,134,135,139,146,160,170,167,165,180,205,
+227,240,247,251,253,254,255,255,255,255,254,251,248,247,247,245,245,245,245,244,241,232,217,204,187,163,138,116,93,66,50,50,57,62,66,71,74,77,80,84,88,88,81,64,39,16,2,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,10,14,14,12,11,14,30,62,110,166,210,237,247,241,227,207,182,150,127,119,124,134,142,147,154,
+161,166,168,171,171,171,171,171,174,182,191,202,212,214,211,209,209,217,228,239,245,248,248,247,243,235,223,208,194,183,169,149,129,113,101,95,91,87,84,84,83,82,82,82,82,82,82,81,
+78,74,73,74,77,72,61,57,57,62,68,72,79,83,88,99,106,106,112,124,136,145,142,123,93,60,32,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,4,10,14,15,15,14,15,20,23,20,15,14,12,21,109,224,235,218,200,177,158,149,146,140,138,133,128,124,121,120,119,116,114,112,112,112,112,112,115,118,114,105,
+95,88,86,86,86,86,86,86,86,87,93,97,92,90,95,110,130,150,169,186,199,211,220,226,229,233,242,250,253,254,254,252,248,242,235,224,206,175,136,105,84,74,72,74,80,84,90,101,
+107,107,113,125,137,145,142,124,93,60,32,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,26,63,113,166,211,
+237,240,225,189,140,96,64,39,20,10,6,8,12,17,21,29,40,48,56,66,76,83,87,89,89,90,93,99,99,89,73,63,61,69,86,112,136,157,175,191,209,226,236,240,241,241,238,227,
+213,193,171,158,143,119,99,82,66,57,54,54,52,51,52,51,46,41,41,40,39,36,32,30,31,33,36,41,49,56,61,62,59,54,57,66,77,90,101,103,92,73,53,36,17,3,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,55,125,115,80,57,37,22,17,16,17,19,26,
+34,43,51,62,73,81,85,86,88,88,88,87,82,66,46,31,21,15,14,14,14,14,14,14,14,14,16,19,21,25,26,27,28,32,38,48,61,73,81,86,88,95,117,149,177,195,210,227,
+238,241,241,238,230,212,184,151,115,84,59,41,34,37,45,57,60,57,60,69,82,95,103,104,95,76,56,37,19,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,1,3,6,10,16,25,48,90,149,199,231,245,239,209,159,106,56,21,5,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,10,12,12,13,13,13,12,10,5,0,0,
+0,0,2,7,15,26,37,53,84,124,161,196,217,229,240,246,248,247,244,242,236,225,212,200,186,171,166,161,150,147,148,148,146,147,147,147,147,147,147,147,148,147,146,154,167,168,157,132,
+114,111,111,114,107,74,49,56,87,122,146,154,140,115,82,54,34,17,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,4,4,4,2,0,0,0,0,
+0,0,0,0,7,16,12,2,0,0,0,0,0,0,0,0,0,0,1,3,7,11,13,13,14,14,14,14,11,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,5,18,35,51,71,105,144,173,191,204,219,234,242,240,229,211,181,146,104,62,32,16,9,5,3,4,8,15,25,42,64,87,109,119,98,56,18,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+
+unsigned char linesmap[TEXSIZE * TEXSIZE] = {
+93,102,35,124,79,0,74,178,178,69,24,168,206,164,100,25,8,34,71,85,11,0,94,248,249,232,251,235,50,0,0,0,0,90,169,68,154,248,248,115,12,0,3,36,19,0,0,0,
+0,0,0,0,16,38,5,0,0,10,79,102,76,26,45,79,48,138,179,138,18,0,0,0,0,18,198,248,216,95,22,0,13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0,
+0,3,64,209,248,203,26,39,12,88,149,55,19,0,0,0,3,70,71,43,23,38,5,81,243,248,248,249,251,190,30,25,93,102,35,124,79,0,74,178,178,69,24,168,206,164,116,224,
+248,249,250,250,135,0,0,0,52,164,120,65,207,248,149,0,0,90,169,68,2,0,8,39,12,0,3,36,19,0,0,0,0,0,0,0,84,249,248,90,0,10,79,102,76,26,45,79,
+48,138,179,138,18,18,198,248,198,18,0,8,79,83,22,0,13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0,0,3,50,50,2,0,8,39,12,88,149,55,19,0,0,0,
+3,70,71,43,93,61,5,0,0,0,0,27,179,160,30,25,25,47,2,3,6,73,178,178,74,0,10,48,175,209,162,27,3,42,39,54,82,13,0,127,252,251,241,50,0,0,0,0,
+1,47,121,149,22,94,248,249,155,14,33,19,0,0,0,0,0,0,0,0,0,16,39,3,9,79,102,76,27,32,0,16,84,54,138,179,138,18,0,0,0,0,26,216,250,199,46,22,
+3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0,1,62,209,248,203,18,0,8,37,14,110,156,22,0,0,3,70,71,5,110,124,21,108,243,248,248,249,250,147,132,123,5,
+25,47,2,3,6,73,178,178,74,0,10,48,175,209,162,51,221,249,249,250,250,133,0,52,164,120,65,207,248,194,18,0,1,47,121,149,22,0,0,34,100,14,33,19,0,0,0,0,
+0,0,0,0,0,104,249,248,96,79,102,76,27,32,0,16,84,54,138,179,138,18,18,198,248,198,26,82,70,6,30,22,3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0,
+1,47,50,2,0,0,0,8,37,14,110,156,22,0,0,3,70,71,5,156,249,224,62,6,0,0,22,145,97,132,123,5,5,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155,
+57,9,10,33,55,82,64,220,251,249,248,90,11,3,0,0,1,22,4,88,148,19,106,252,250,128,26,0,37,19,0,0,0,0,0,0,0,0,12,40,79,102,76,27,32,3,0,0,
+20,89,56,138,179,138,18,0,0,9,82,84,199,248,198,49,49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0,19,203,248,203,18,0,0,0,8,58,26,86,141,16,3,70,
+71,3,0,7,122,165,244,249,248,249,250,149,36,7,122,122,5,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155,85,222,248,249,250,250,151,163,120,65,207,248,196,21,0,0,
+1,22,4,88,148,19,19,149,93,58,26,0,37,19,0,0,0,0,0,0,0,0,101,249,250,156,76,27,32,3,0,0,20,89,56,138,179,138,18,18,198,248,216,84,3,0,0,33,
+49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0,1,22,4,0,0,0,0,0,8,58,26,86,141,16,3,70,71,3,81,243,252,252,224,61,6,22,148,100,36,7,122,122,
+149,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207,158,31,0,13,33,97,230,251,235,122,248,248,101,36,3,0,0,0,0,0,83,140,140,147,249,249,112,62,156,39,0,0,
+0,0,0,0,0,0,8,82,102,77,26,32,3,0,0,8,44,29,87,56,138,179,138,18,9,82,71,2,18,198,248,206,54,21,0,19,143,127,6,0,0,0,0,0,12,84,77,24,
+198,248,203,18,0,0,0,3,34,23,34,12,76,137,86,71,3,0,0,0,85,249,252,248,250,250,149,36,3,0,5,128,149,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207,
+158,67,221,248,249,250,253,178,62,207,248,194,34,36,3,0,0,0,0,0,83,140,140,84,34,23,34,62,156,39,0,0,0,0,0,0,0,0,8,149,251,250,107,32,3,0,0,8,
+44,29,87,56,138,179,138,18,26,216,250,198,18,0,6,34,39,21,0,19,143,127,6,0,0,0,0,0,12,84,77,7,0,0,0,0,0,0,0,3,34,23,34,12,76,137,86,71,
+3,81,243,248,248,252,249,88,55,150,99,36,3,0,5,128,141,113,76,178,178,74,0,10,34,40,88,28,0,6,50,168,203,156,33,0,64,226,251,239,50,0,94,248,248,102,36,3,
+0,0,0,0,18,168,169,52,106,248,249,203,64,0,0,0,0,0,0,0,0,12,79,102,79,48,32,2,0,0,10,57,33,0,19,88,56,138,179,142,94,71,2,0,0,24,206,248,
+198,49,28,123,131,43,6,0,0,0,0,0,0,14,95,216,248,203,18,0,0,0,3,36,19,0,8,36,16,130,177,25,0,0,0,81,243,248,252,252,249,160,36,2,0,0,10,66,
+141,113,76,178,178,74,0,10,34,40,88,28,0,6,50,168,203,156,69,226,249,252,251,250,227,248,194,18,0,19,36,3,0,0,0,0,18,168,169,52,19,0,58,174,64,0,0,0,
+0,0,0,0,0,12,79,102,147,249,245,91,0,0,10,57,33,0,19,88,56,138,179,142,94,84,198,248,198,24,38,13,0,33,28,123,131,43,6,0,0,0,0,0,0,14,83,79,
+14,0,0,0,0,0,3,36,19,0,8,36,16,130,177,25,81,243,248,248,248,243,160,121,140,117,36,2,0,0,10,66,0,142,179,178,74,0,10,33,40,88,28,0,6,38,13,21,
+165,204,150,79,219,251,234,85,82,13,0,94,248,248,102,36,3,0,0,22,147,83,105,154,19,124,252,249,115,13,0,0,0,0,0,3,8,73,102,76,26,38,36,6,0,10,62,36,
+0,0,0,20,88,54,142,203,170,20,0,0,6,38,31,198,248,199,148,136,6,14,35,6,0,0,0,0,0,18,201,250,220,29,0,0,0,3,36,19,0,0,0,8,88,74,89,148,
+22,0,81,243,248,248,249,251,189,41,36,6,0,10,62,37,0,142,179,178,74,0,10,33,40,88,28,0,6,38,13,21,165,204,150,104,245,251,250,250,250,220,18,0,0,0,19,36,
+3,0,0,22,147,83,105,154,19,48,159,59,38,13,0,0,0,0,0,3,8,73,102,76,26,122,249,243,90,10,62,36,0,0,0,20,88,54,142,203,170,20,18,198,248,206,31,0,
+0,6,140,136,6,14,35,6,0,0,0,0,0,0,14,83,85,12,0,0,0,3,36,19,0,0,0,8,88,74,89,182,244,248,248,248,243,81,27,179,158,41,36,6,0,10,62,37,
+72,170,178,74,0,10,33,40,88,28,0,6,38,14,0,0,20,159,204,234,251,231,49,32,55,82,13,0,94,248,248,102,36,3,22,148,90,36,19,81,152,149,125,248,248,114,13,0,
+0,0,0,6,35,46,69,28,32,1,13,34,16,60,37,0,0,0,0,0,17,82,99,168,180,138,18,6,38,14,0,18,199,252,226,53,24,0,13,38,6,0,0,0,18,198,248,206,
+90,84,12,0,3,36,19,0,0,0,3,68,71,36,12,88,148,96,243,248,249,249,250,147,132,121,17,34,16,60,37,0,72,170,178,74,0,10,33,40,88,28,0,6,38,14,0,0,
+20,159,203,194,149,235,248,249,250,250,112,0,0,0,0,19,36,3,22,148,90,36,19,81,152,149,48,0,2,38,13,0,0,0,0,6,35,46,69,28,32,1,107,249,244,129,37,0,
+0,0,0,0,17,82,99,168,180,138,18,24,206,248,198,18,5,123,124,38,24,0,13,38,6,0,0,0,0,0,0,13,78,84,12,0,3,36,19,0,0,0,3,68,71,36,89,247,
+252,249,248,243,106,31,145,97,132,121,17,34,16,60,37,0,178,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,70,235,254,245,66,0,13,33,55,82,13,0,94,248,248,
+102,55,149,89,36,19,0,46,174,152,16,98,249,248,113,14,0,0,0,0,10,33,24,30,3,0,0,20,82,41,0,0,0,0,0,0,6,82,102,56,138,179,141,53,14,0,0,5,
+132,226,248,198,48,24,0,14,38,6,0,18,198,248,203,18,13,78,84,16,32,19,0,0,0,3,70,71,2,5,38,13,141,250,249,248,249,251,152,33,7,122,122,25,73,38,0,74,
+178,178,74,0,10,33,63,100,28,0,6,38,14,0,0,0,0,66,195,209,172,219,248,248,249,250,250,107,0,0,0,0,19,55,149,89,36,19,0,46,174,152,16,7,44,10,36,14,
+0,0,0,0,10,33,24,30,3,0,0,111,250,245,90,0,0,0,0,0,6,82,102,56,138,179,141,53,31,198,248,199,132,124,6,1,33,24,0,14,38,6,0,0,0,0,0,0,
+13,78,84,16,32,19,0,0,0,3,70,71,2,84,245,248,250,252,244,81,32,162,104,33,7,122,122,25,73,38,0,74,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,
+56,223,252,243,211,156,24,0,13,33,54,80,28,0,94,248,249,191,110,34,18,0,53,157,48,81,148,26,138,250,248,113,14,0,0,0,0,28,56,10,0,0,10,59,109,140,11,0,
+0,0,0,9,82,66,24,86,56,140,190,144,18,0,6,122,124,23,198,248,198,47,12,0,14,38,23,198,249,203,18,1,63,133,86,96,27,0,0,0,3,70,71,3,0,0,7,107,
+244,250,252,250,251,156,56,10,0,5,127,153,46,32,78,178,178,74,0,10,33,63,233,204,18,6,38,14,0,0,0,0,52,157,124,176,245,252,211,231,248,249,250,250,112,0,0,0,
+24,155,110,34,18,0,53,157,48,81,148,26,70,68,6,36,14,0,0,0,0,28,56,10,0,0,10,59,166,252,243,90,0,0,0,9,82,66,24,86,56,140,190,144,18,18,199,252,
+225,23,0,0,1,32,12,0,14,38,5,0,22,2,0,1,63,133,86,96,27,0,0,0,3,70,71,3,81,243,248,249,248,247,177,83,170,110,56,10,0,5,127,153,46,32,78,178,
+74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,56,226,251,228,57,163,204,144,17,0,12,30,74,99,16,0,102,252,250,119,45,1,0,55,52,0,0,88,148,25,138,250,248,
+113,14,0,0,24,30,11,38,8,9,62,37,11,129,142,11,0,0,9,82,71,3,0,17,86,78,142,179,137,30,117,124,13,0,18,198,248,198,20,0,0,31,205,249,214,22,0,4,
+131,179,153,90,82,12,0,3,70,71,3,0,0,0,81,243,249,248,252,253,190,44,9,38,8,9,66,140,112,86,190,180,74,0,10,33,40,100,204,248,199,53,14,0,0,0,0,52,
+167,118,64,211,252,243,152,67,230,248,249,250,251,100,0,13,141,89,45,45,1,0,55,52,0,0,88,148,25,70,68,6,36,14,0,0,24,30,11,38,8,9,62,37,11,180,252,243,
+86,0,9,82,71,3,0,17,86,78,142,179,137,30,126,225,248,198,18,0,0,0,2,0,0,14,32,44,53,4,0,4,131,179,153,90,82,12,0,3,70,71,3,81,243,248,248,248,
+245,88,120,209,159,44,9,38,8,9,66,140,112,86,190,180,4,8,33,40,88,28,0,6,38,14,0,0,0,0,56,228,251,229,36,0,19,163,204,144,17,0,48,63,56,82,13,7,
+124,249,248,100,36,3,0,0,0,0,0,88,148,24,138,250,248,113,12,21,33,1,0,8,38,61,35,0,0,5,129,141,6,8,82,71,2,0,0,3,46,90,56,136,179,169,118,16,
+61,16,0,18,198,248,198,18,18,198,249,217,27,0,0,0,24,156,183,137,87,82,18,66,70,3,0,0,0,81,243,248,248,251,251,203,160,22,0,8,38,61,35,0,142,179,175,99,
+4,8,33,40,88,28,18,199,249,201,18,0,0,0,52,167,134,72,207,248,198,170,204,144,67,239,249,250,250,250,98,7,47,36,16,16,36,3,0,0,0,0,0,88,148,24,70,68,
+6,36,12,21,33,1,0,8,38,61,35,0,0,5,180,252,243,92,82,71,2,0,0,3,46,90,56,136,179,169,118,33,212,248,198,18,0,0,0,0,0,0,49,69,10,0,0,0,
+24,156,183,137,87,82,18,66,70,3,81,243,248,248,248,243,83,80,182,179,160,22,0,8,38,61,35,0,142,179,175,99,40,34,39,88,28,0,6,38,14,0,0,0,0,56,227,251,
+230,84,14,1,47,36,162,204,145,56,53,16,31,55,81,17,32,106,248,248,102,36,3,0,0,0,0,0,98,150,24,138,250,248,120,39,0,0,0,8,61,56,7,0,0,0,5,127,
+140,83,70,2,0,0,6,38,10,16,88,62,171,179,134,15,30,64,14,1,62,203,248,202,202,249,214,34,35,6,0,3,36,38,142,179,136,82,100,68,0,0,0,0,81,243,248,248,
+250,252,187,58,87,148,22,8,61,56,7,72,170,179,142,12,40,34,39,88,28,0,6,53,201,248,203,18,0,52,164,118,78,218,248,194,62,36,162,204,145,98,242,248,249,250,247,97,
+32,19,0,0,19,36,3,0,0,0,0,0,98,150,24,70,68,6,47,39,0,0,0,8,61,56,7,0,0,0,5,179,252,247,132,2,0,0,6,38,10,16,88,62,171,179,134,15,
+46,212,248,171,48,22,0,0,0,45,53,17,35,6,0,3,36,38,142,179,136,82,100,68,0,81,243,248,248,248,243,81,59,190,154,58,87,148,22,8,61,56,7,72,170,179,142,12,
+43,58,86,27,0,6,38,14,0,0,0,0,59,227,251,228,31,27,58,53,47,4,18,162,208,168,19,0,13,32,55,95,28,0,94,248,248,102,36,3,0,0,0,0,0,89,148,24,
+136,250,249,111,15,0,10,62,35,9,38,10,0,0,0,10,163,167,12,0,0,6,38,14,0,0,22,165,141,135,179,138,18,28,58,53,46,23,202,248,249,216,21,0,14,36,9,34,
+19,0,20,145,179,163,101,79,11,0,0,81,243,248,248,250,252,187,54,31,14,88,152,79,35,9,101,181,178,76,112,125,43,58,86,27,0,6,38,14,18,198,248,203,66,164,120,64,
+207,249,208,68,47,4,18,162,208,168,73,239,248,249,250,247,100,0,0,0,0,19,36,3,0,0,0,0,0,89,148,24,67,76,30,32,15,0,10,62,35,9,38,10,0,0,0,10,
+200,253,243,86,0,6,38,14,0,0,22,165,141,135,179,138,18,44,190,75,46,6,0,0,46,55,4,0,14,36,9,34,19,0,20,145,179,163,101,79,88,243,248,248,248,243,81,60,
+190,155,54,31,14,88,152,79,35,9,101,181,178,76,112,125,142,93,53,1,5,38,14,0,0,0,0,59,227,251,228,31,0,1,59,76,17,0,1,57,178,170,22,0,0,13,52,62,
+79,13,0,94,248,248,102,36,3,0,0,0,0,0,88,148,42,147,250,248,103,11,62,37,0,0,10,39,10,0,9,75,65,130,140,10,5,38,14,0,0,5,122,131,88,57,138,179,
+138,19,59,76,17,18,202,249,250,203,26,22,0,14,58,21,0,0,0,24,177,199,135,84,85,12,81,243,248,248,250,252,187,52,0,6,22,11,128,163,23,69,181,190,81,0,14,139,
+142,93,53,1,5,38,14,0,0,18,194,249,236,130,65,207,248,194,73,76,17,0,1,57,178,170,22,63,239,248,250,250,247,86,0,0,0,0,19,36,3,0,0,0,0,0,88,148,
+42,84,66,7,20,11,62,37,0,0,10,39,10,0,9,75,65,181,252,243,89,38,14,0,0,5,122,131,88,57,138,179,138,19,59,76,17,0,1,46,54,5,9,22,0,14,58,21,
+0,0,0,24,177,199,135,138,247,248,248,248,243,81,62,190,155,52,0,6,22,11,128,163,23,69,181,190,81,0,14,139,168,136,13,36,36,11,0,0,0,0,59,229,251,228,27,0,
+3,50,44,28,59,16,39,51,19,55,84,12,0,31,28,29,54,82,13,0,94,248,248,102,34,3,0,0,0,0,0,102,160,28,138,250,248,127,36,0,0,0,0,10,33,16,79,68,
+1,5,129,141,41,11,0,0,5,122,122,5,17,87,60,138,180,161,58,28,73,202,249,216,203,248,203,99,31,24,28,32,6,0,3,70,87,149,179,130,82,138,243,248,248,249,251,187,
+52,0,0,0,7,59,36,81,156,173,175,81,35,16,29,44,168,136,13,36,36,11,0,0,0,0,66,233,251,217,210,248,195,64,44,28,59,16,39,51,19,55,84,12,68,241,249,249,
+250,247,82,0,0,0,0,19,34,3,0,0,0,0,0,102,160,28,69,66,12,57,36,0,0,0,0,10,33,16,79,68,1,5,182,252,245,89,0,0,5,122,122,5,17,87,60,138,
+180,161,58,28,59,16,39,52,4,0,22,87,31,24,28,32,6,0,3,70,87,149,203,249,250,250,248,243,81,52,186,155,52,0,0,0,7,59,36,81,156,173,175,81,35,16,29,44,
+32,122,125,46,38,20,23,0,0,59,229,251,225,27,0,4,52,46,1,0,26,73,49,1,0,0,50,82,40,14,0,12,32,55,82,13,0,94,248,248,101,35,3,0,0,0,24,31,
+88,148,23,138,250,249,90,0,0,0,0,0,14,93,73,1,0,0,11,144,142,25,23,5,122,122,5,0,0,17,85,60,159,193,138,34,204,250,213,19,18,198,248,205,112,42,0,13,
+34,11,68,70,3,25,150,179,168,247,250,248,249,248,169,52,0,0,0,10,60,34,0,69,179,179,86,0,16,52,43,86,32,122,125,46,38,20,23,0,0,52,164,130,209,248,248,199,
+66,46,1,0,26,73,49,1,0,0,50,82,40,82,239,248,249,228,107,13,0,0,0,0,18,35,3,0,0,0,24,31,88,148,23,70,94,33,0,0,0,0,0,0,14,93,73,1,
+0,0,11,190,252,244,97,5,122,122,5,0,0,17,85,60,159,193,138,18,26,73,49,1,0,0,0,30,101,42,0,13,34,11,68,70,3,99,250,253,252,250,247,89,40,105,128,52,
+0,0,0,10,60,34,0,69,179,179,86,0,16,52,43,86,0,5,129,127,30,58,8,0,59,230,251,225,27,0,4,53,48,2,0,2,44,59,55,15,0,0,0,70,89,11,0,0,
+13,33,55,82,13,0,94,248,248,102,36,3,0,24,33,1,0,88,152,74,146,250,248,90,0,0,0,9,80,73,35,8,0,0,14,14,135,150,26,119,122,5,0,0,0,0,20,102,
+85,138,184,229,250,215,69,15,0,18,199,249,208,98,30,0,14,88,70,2,0,0,26,184,251,252,250,250,248,151,52,0,0,0,10,62,37,0,74,178,173,123,135,31,31,44,100,34,
+0,5,129,127,30,58,8,0,52,164,120,65,210,248,248,219,62,2,0,2,44,59,55,15,0,0,0,70,89,11,72,243,223,60,55,82,13,0,0,0,0,19,36,3,0,24,33,1,
+0,88,152,74,82,66,2,0,0,0,0,9,80,73,35,8,0,0,14,14,186,253,244,162,122,5,0,0,0,0,20,102,85,138,179,139,59,59,55,15,0,0,3,30,44,86,30,0,
+14,88,70,2,81,243,249,252,253,249,134,89,98,102,52,0,0,0,10,62,37,0,74,178,173,123,135,31,31,44,100,34,10,0,5,131,139,20,36,61,230,251,225,27,0,4,54,47,
+1,0,2,49,51,3,25,64,16,1,35,15,48,84,13,0,0,13,33,55,82,13,0,94,248,248,102,31,24,32,1,0,0,10,129,163,25,138,250,248,90,0,9,82,71,1,8,37,
+7,0,0,17,35,123,178,118,3,0,0,0,0,4,49,53,82,72,229,253,236,36,25,64,16,1,52,202,248,205,99,29,62,73,35,5,0,0,81,244,252,253,252,248,151,58,0,0,
+0,10,62,37,0,74,178,178,72,0,93,162,58,86,35,32,10,0,5,131,139,20,36,54,163,120,65,207,248,198,209,249,207,18,2,49,51,3,25,64,16,1,35,15,48,84,13,68,
+27,13,33,55,82,13,0,0,0,0,18,31,24,32,1,0,0,10,129,163,25,69,70,3,0,0,9,82,71,1,8,37,7,0,0,17,35,180,252,249,83,0,0,0,0,4,49,53,
+82,58,138,193,162,21,25,64,16,1,36,19,0,30,87,29,62,73,35,84,243,248,248,249,250,203,144,106,102,58,0,0,0,10,62,37,0,74,178,178,72,0,93,162,58,86,35,32,
+39,8,17,41,124,113,68,233,251,220,27,0,5,54,46,1,0,4,49,51,3,0,0,26,61,42,15,0,0,50,85,17,0,0,13,33,55,82,13,0,94,248,248,112,53,1,0,0,
+10,62,37,88,148,23,138,250,248,95,82,71,2,0,0,7,37,8,17,36,6,115,170,136,9,0,0,0,5,54,46,0,32,216,251,235,185,138,18,26,61,42,15,18,198,248,206,113,
+75,0,12,38,6,81,243,248,249,252,253,198,90,78,12,0,10,62,37,0,74,178,178,74,0,10,33,114,185,47,0,10,39,8,17,41,124,113,61,172,119,63,207,248,195,68,58,194,
+248,208,67,51,3,0,0,26,61,42,15,0,0,50,85,17,0,0,13,33,55,82,13,0,0,0,0,33,53,1,0,0,10,62,37,88,148,23,70,70,0,8,82,71,2,0,0,7,
+37,8,17,36,6,115,206,252,243,81,0,0,5,54,46,0,15,83,86,159,180,138,18,26,61,42,15,0,0,0,38,102,75,0,89,245,248,248,248,243,101,172,209,171,90,78,12,0,
+10,62,37,0,74,178,178,74,0,10,33,114,185,47,0,10,8,46,38,2,0,138,237,251,224,29,0,5,54,46,0,0,0,43,51,3,0,0,0,0,48,66,15,0,0,0,50,42,
+0,0,0,13,33,55,82,13,0,94,248,250,135,36,32,30,62,37,0,0,112,157,22,136,250,250,135,2,0,0,0,0,7,46,38,7,122,119,18,127,142,11,0,5,54,46,0,18,
+198,249,224,74,138,179,138,18,48,66,15,0,18,201,250,212,94,29,0,14,107,243,248,248,249,248,215,194,117,77,82,23,58,37,0,74,189,185,74,0,10,33,40,88,106,148,22,0,
+8,46,38,2,0,134,182,122,84,207,248,195,66,46,0,14,194,249,217,24,0,0,0,0,48,66,15,0,0,0,50,42,0,0,0,13,33,55,82,13,0,0,21,82,70,36,32,30,
+62,37,0,0,112,157,22,67,67,77,69,2,0,0,0,0,7,46,38,7,122,119,18,180,252,243,81,5,54,46,0,0,0,48,102,61,138,179,138,18,48,66,15,0,0,13,78,65,
+81,101,243,248,249,248,243,81,42,120,196,194,117,77,82,23,58,37,0,74,189,185,74,0,10,33,40,88,106,148,22,0,17,38,36,10,57,229,253,233,41,34,12,54,45,0,0,0,
+0,14,3,0,0,0,3,36,15,24,64,18,0,0,0,0,0,0,0,0,13,33,55,82,12,19,147,251,250,108,96,174,55,0,0,0,24,130,155,31,158,251,248,90,0,0,0,0,
+16,38,40,127,122,5,0,5,129,140,16,54,45,0,18,198,248,205,38,85,62,138,180,154,32,24,64,14,11,96,209,248,204,102,30,81,244,249,248,249,248,151,80,158,168,109,77,102,
+42,0,74,178,185,120,20,8,33,40,88,28,0,88,148,22,17,38,36,10,50,149,173,148,210,249,197,65,45,0,0,0,14,197,248,207,22,0,3,36,15,24,64,18,0,0,0,0,
+0,0,0,0,13,33,55,82,12,19,84,102,89,28,96,174,55,0,0,0,24,130,155,31,102,98,5,0,0,0,0,0,16,38,40,127,122,5,0,5,185,252,243,115,45,0,0,0,
+0,10,21,85,62,138,180,154,32,24,64,14,11,84,50,0,101,247,249,248,248,245,84,41,101,102,80,158,168,109,77,102,42,0,74,178,185,120,20,8,33,40,88,28,0,88,148,22,
+55,1,9,86,234,251,217,137,122,21,69,44,0,0,0,0,0,0,0,31,3,1,34,19,0,0,27,64,18,0,0,0,0,0,0,0,0,13,33,53,82,84,102,152,248,248,132,124,
+148,22,0,0,0,19,127,182,80,135,250,248,90,0,0,15,34,6,126,140,9,0,0,0,5,130,158,49,0,18,198,248,203,18,0,16,85,62,150,184,138,18,23,64,85,48,18,198,
+248,205,150,244,248,248,250,248,151,52,0,36,150,170,142,84,80,82,178,178,74,20,63,43,39,88,28,0,0,0,88,156,55,1,9,76,164,118,66,230,252,199,79,44,0,0,0,0,
+0,14,194,249,207,23,34,19,0,0,27,64,18,0,0,0,0,0,0,0,0,13,33,53,82,84,102,92,21,7,64,124,148,22,0,0,0,19,127,182,80,64,68,3,0,0,0,15,
+34,6,126,140,9,0,0,0,5,186,253,245,77,0,0,0,0,0,0,16,85,62,150,184,138,18,23,64,85,48,0,81,243,249,250,249,243,88,63,100,102,52,0,36,150,170,142,84,
+80,82,178,178,74,20,63,43,39,88,28,0,0,0,88,156,149,19,59,233,251,217,22,5,126,150,53,32,6,0,0,0,0,0,47,102,63,31,16,0,0,0,0,26,63,18,0,0,
+0,0,0,0,0,0,9,43,93,102,90,17,98,250,249,100,111,149,22,0,0,6,84,151,156,22,138,250,248,90,20,35,6,122,122,8,2,0,0,0,8,57,148,139,28,198,248,203,
+18,0,0,0,16,98,71,138,179,143,27,89,86,14,0,18,198,248,247,250,249,249,248,151,54,0,0,0,42,177,189,108,128,204,182,74,0,7,43,73,90,25,0,0,0,0,20,112,
+149,19,48,164,121,64,207,248,224,155,53,32,6,0,0,0,0,0,55,218,250,213,37,0,0,0,0,26,63,18,0,0,0,0,0,0,0,0,9,43,93,102,90,17,6,62,34,15,
+111,149,22,0,0,6,84,151,156,22,70,70,3,0,20,35,6,122,122,8,2,0,0,0,8,57,195,252,243,77,0,0,0,0,0,0,16,98,71,138,179,143,27,89,86,14,81,243,
+248,248,249,247,99,37,101,102,54,0,0,0,42,177,189,108,128,204,182,74,0,7,43,73,90,25,0,0,0,0,20,112,81,157,230,251,217,22,0,0,42,145,122,18,38,6,0,0,
+0,0,27,92,102,70,0,0,0,0,0,0,26,62,18,0,0,0,0,0,0,0,19,85,102,96,78,20,58,117,248,248,102,112,149,22,9,82,67,22,128,156,22,138,250,248,102,8,
+122,122,5,0,0,0,0,0,38,45,5,138,229,248,203,18,0,0,0,3,31,30,82,63,143,137,92,47,22,63,18,0,93,246,248,249,250,248,150,58,30,6,0,10,62,69,155,179,
+183,196,132,10,6,33,39,90,72,17,0,0,0,1,21,3,81,152,153,115,64,207,248,194,54,145,122,18,38,6,0,0,0,0,27,98,218,250,207,27,0,0,0,0,26,62,18,0,
+0,0,0,0,0,0,19,85,102,96,78,20,58,37,0,0,19,112,149,22,9,82,67,22,128,156,22,69,70,3,19,8,122,122,5,0,0,0,0,0,38,45,5,185,252,243,77,0,
+0,0,0,3,31,30,82,63,143,137,92,47,22,124,244,248,248,248,243,99,92,100,102,58,30,6,0,10,62,69,155,179,183,196,132,10,6,33,39,90,72,17,0,0,0,1,21,3,
+62,236,253,219,18,0,0,0,4,5,122,122,19,38,6,0,0,0,0,48,94,102,62,2,0,0,0,11,71,62,62,18,0,0,0,0,0,22,86,102,91,44,56,102,43,0,94,248,
+248,102,109,153,96,71,2,0,22,130,156,22,138,250,248,169,122,5,0,0,0,0,0,0,4,0,18,199,252,232,29,0,0,0,3,36,19,0,15,81,65,82,50,0,0,26,64,93,
+243,248,248,249,248,151,66,0,13,34,16,60,37,0,98,179,179,137,76,84,40,39,87,25,18,64,22,0,0,0,0,0,47,178,186,77,207,248,194,14,4,5,122,122,19,38,6,0,
+0,0,0,48,100,218,250,207,27,0,0,11,71,62,62,18,0,0,0,0,0,22,86,102,91,44,56,102,43,0,0,0,0,19,109,153,96,71,2,0,22,130,156,22,69,70,5,122,
+122,5,0,0,0,0,0,0,4,0,0,5,185,252,243,77,0,0,3,36,19,0,15,81,65,82,50,0,81,244,250,248,248,243,81,39,100,102,66,0,13,34,16,60,37,0,98,179,
+179,137,76,84,40,39,87,25,18,64,22,0,0,0,0,0,232,251,227,156,22,0,0,0,0,0,5,122,122,19,38,6,0,3,36,14,22,92,102,63,2,0,11,80,102,71,26,64,
+19,0,0,0,22,86,102,90,16,16,66,70,78,13,0,94,248,248,104,148,177,24,0,0,0,22,130,156,20,139,253,252,94,0,0,0,0,0,0,0,0,18,198,248,204,139,142,11,
+0,3,36,19,0,0,0,26,102,75,0,0,0,0,99,246,248,248,249,248,151,66,80,29,0,20,73,38,0,70,173,174,168,179,111,83,88,82,25,0,0,22,64,22,0,0,0,52,
+162,116,126,235,249,194,14,0,0,0,5,122,122,19,38,6,0,3,36,14,22,98,216,250,207,27,11,80,102,71,26,64,19,0,0,0,22,86,102,90,16,16,66,70,78,13,0,0,
+0,0,22,148,177,24,0,0,0,22,130,156,20,70,158,124,5,0,0,0,0,0,0,0,0,0,0,0,5,185,252,243,72,3,36,19,0,0,0,26,102,75,0,81,243,248,249,250,
+244,81,42,101,102,66,80,29,0,20,73,38,0,70,173,174,168,179,111,83,88,82,25,0,0,22,64,22,0,0,0,66,251,213,18,88,148,22,0,0,0,0,0,5,122,122,19,36,
+9,34,19,0,0,23,92,102,61,18,80,102,78,9,27,86,64,19,0,22,87,102,90,17,6,59,42,30,55,82,13,0,94,248,250,139,110,149,22,0,0,0,22,128,144,121,192,250,
+248,90,0,0,0,0,0,0,18,198,248,203,18,5,129,141,14,34,19,0,0,0,13,80,55,77,48,0,0,81,243,249,250,250,248,151,52,0,29,87,37,53,42,32,71,168,178,68,
+43,169,188,128,102,86,8,0,0,0,22,64,22,0,52,163,119,65,207,250,229,35,0,0,0,0,0,5,122,122,19,36,9,34,19,0,0,23,98,216,250,210,99,102,78,9,0,25,
+64,19,0,22,87,102,90,17,6,59,42,30,55,82,13,0,0,9,79,76,110,149,22,0,0,0,22,128,144,121,154,71,1,0,0,0,0,0,0,0,0,0,0,0,0,5,187,252,
+243,96,19,0,0,0,13,80,55,77,114,243,248,248,248,244,119,54,100,102,52,0,29,87,37,53,42,32,71,168,178,68,43,169,188,128,102,86,8,0,0,0,22,64,22,0,66,240,
+166,18,0,0,88,148,22,0,0,0,0,0,5,122,122,19,58,21,0,0,0,0,23,90,102,94,102,75,9,39,217,239,90,58,35,85,102,89,16,6,62,37,0,12,33,55,82,11,
+7,146,250,248,101,112,149,22,0,0,0,22,178,185,27,133,250,248,90,0,0,0,0,18,198,248,203,18,0,0,5,129,152,25,0,0,0,13,84,50,0,14,85,48,81,244,248,248,
+250,248,151,50,0,0,0,36,102,55,0,84,180,169,74,0,10,75,181,204,119,74,84,12,0,0,0,22,64,67,162,119,65,207,248,194,98,148,22,0,0,0,0,0,5,122,122,19,
+58,21,0,0,0,0,23,95,216,250,229,94,9,13,4,0,25,58,35,85,102,89,16,6,62,37,0,12,33,55,82,11,7,82,71,1,16,112,149,22,0,0,0,22,178,185,27,62,
+62,2,0,0,0,0,0,0,0,0,0,0,0,0,5,187,253,244,72,0,0,13,84,50,0,90,247,249,248,248,243,81,56,102,102,50,0,0,0,36,102,55,0,84,180,169,74,0,
+10,75,181,204,119,74,84,12,0,0,0,22,64,80,234,251,0,0,0,0,0,88,148,22,0,0,0,0,0,5,124,139,33,34,6,0,0,0,0,34,102,102,97,24,31,223,249,248,
+239,99,97,102,86,16,6,62,37,0,0,0,13,33,53,78,78,68,96,248,248,102,112,150,23,0,5,121,124,128,154,22,136,250,248,90,0,0,18,198,248,203,18,0,0,0,3,37,
+137,140,11,0,13,84,50,0,0,0,22,147,245,248,249,249,248,151,82,16,0,0,10,56,56,84,95,178,173,95,4,8,34,40,120,178,179,100,78,86,12,0,0,0,67,182,121,62,
+207,248,194,14,0,88,148,22,0,0,0,0,0,5,124,139,33,34,6,0,0,0,0,34,107,216,251,216,27,19,36,3,0,38,97,102,86,16,6,62,37,0,0,0,13,33,53,78,
+78,68,2,0,0,19,112,150,23,0,5,121,124,128,154,22,67,69,3,0,0,0,0,0,0,0,0,0,0,0,3,37,191,252,243,72,13,84,50,0,81,243,248,251,249,244,101,43,
+99,102,82,16,0,0,10,56,56,84,95,178,173,95,4,8,34,40,120,178,179,100,78,86,12,0,0,0,81,239,251,213,0,0,0,0,0,0,88,150,31,0,0,0,0,3,40,132,
+122,19,38,6,0,0,13,79,102,100,102,80,83,243,248,249,249,244,143,102,32,6,62,37,0,0,0,0,0,10,36,92,102,15,0,94,248,248,102,102,145,34,121,124,4,22,130,158,
+20,138,250,248,90,18,198,248,203,18,0,0,0,3,36,19,5,129,139,24,83,50,0,0,0,0,82,245,249,248,250,248,151,49,22,63,18,9,62,37,0,95,205,187,71,12,40,34,
+40,88,28,52,170,179,98,66,83,13,0,58,160,121,98,210,248,194,14,0,0,0,88,150,31,0,0,0,0,3,40,132,122,19,38,6,0,0,13,79,102,106,213,250,215,27,18,30,
+24,84,102,102,32,6,62,37,0,0,0,0,0,10,36,92,102,15,0,0,0,0,19,102,145,34,121,124,4,22,130,158,20,70,70,3,0,0,0,0,0,0,0,0,0,3,36,19,
+5,187,252,244,132,50,0,81,243,248,248,249,245,81,53,112,103,49,22,63,18,9,62,37,0,95,205,187,71,12,40,34,40,88,28,52,170,179,98,66,83,13,0,72,234,251,221,35,
+21,0,0,0,0,0,0,86,151,22,0,0,3,36,19,5,122,122,19,38,3,12,83,102,72,30,90,102,83,91,243,249,250,251,244,90,54,62,53,93,13,0,0,0,0,7,82,82,
+54,80,13,0,94,248,248,90,81,175,135,6,0,0,21,134,154,22,138,250,248,216,248,203,18,0,0,0,3,36,19,0,0,5,134,173,55,0,0,0,0,81,243,248,249,250,251,195,
+72,0,0,22,60,62,34,0,74,178,187,138,28,4,39,58,86,26,0,0,53,171,179,88,50,84,63,163,113,62,211,250,199,14,0,0,0,0,0,86,151,22,0,0,3,36,19,5,
+122,122,19,38,3,12,83,102,72,30,96,213,250,214,27,34,94,102,85,36,54,62,53,93,13,0,0,0,0,7,82,82,54,80,13,0,0,0,0,0,81,175,135,6,0,0,21,134,
+154,22,69,70,3,0,0,0,0,0,0,0,3,36,19,0,0,5,190,253,245,72,81,243,248,248,248,243,99,57,173,167,72,0,0,22,60,62,34,0,74,178,187,138,28,4,39,58,
+86,26,0,0,53,171,179,88,50,84,77,235,251,213,35,62,64,22,0,0,0,0,0,0,88,149,22,3,36,19,0,0,5,122,122,15,42,84,102,75,8,0,20,92,102,79,109,247,
+251,251,248,239,107,83,147,179,93,0,0,0,9,82,68,16,32,55,82,13,0,94,248,248,155,155,138,20,0,0,0,18,128,156,22,146,250,248,219,18,0,0,0,3,36,19,0,0,
+0,13,85,152,138,11,0,0,81,243,248,248,249,251,202,55,14,34,2,7,63,70,18,74,178,178,74,28,89,52,38,90,53,2,0,0,0,57,171,179,79,89,188,115,62,207,248,199,
+74,22,0,0,0,0,0,0,88,149,22,3,36,19,0,0,5,122,122,15,42,84,102,75,8,0,20,97,213,250,222,103,102,96,17,5,64,83,147,179,93,0,0,0,9,82,68,16,
+32,55,82,13,0,0,0,0,100,155,138,20,0,0,0,18,128,156,22,69,70,3,0,0,0,0,0,3,36,19,0,0,0,13,85,202,252,242,245,248,248,248,243,81,47,176,176,55,
+14,34,2,7,63,70,18,74,178,178,74,28,89,52,38,90,53,2,0,0,0,57,171,179,79,100,240,251,213,18,0,20,45,61,22,0,0,0,0,0,0,90,148,55,19,0,0,0,
+0,5,122,128,91,102,75,6,0,16,13,18,88,102,101,156,247,249,248,250,242,171,198,148,25,0,0,9,82,71,3,0,13,33,54,82,17,0,94,251,252,99,84,148,22,0,0,0,
+21,130,164,203,250,250,248,90,0,0,3,36,19,0,0,0,13,84,50,5,129,142,11,81,243,248,248,249,251,202,72,14,0,14,19,60,33,22,119,184,178,74,0,6,52,91,90,22,
+9,38,5,4,9,0,58,167,178,170,124,107,209,248,195,70,45,61,22,0,0,0,0,0,0,90,148,55,19,0,0,0,0,5,122,128,91,102,75,6,0,16,13,18,94,213,251,232,
+100,27,14,60,49,148,198,148,25,0,0,9,82,71,3,0,13,33,54,82,17,0,0,110,133,14,84,148,22,0,0,0,21,130,156,22,69,70,3,0,0,0,3,36,19,0,0,0,
+13,84,50,5,209,252,248,248,248,244,90,45,175,176,72,14,0,14,19,60,33,22,119,184,178,74,0,6,52,91,90,22,9,38,5,4,9,0,58,167,184,236,251,223,28,0,3,59,
+4,20,64,22,0,0,0,0,0,3,113,155,22,0,0,0,0,0,19,166,175,80,35,4,0,5,36,9,40,102,102,101,109,243,250,250,252,250,171,78,21,0,9,82,71,2,0,0,
+0,12,34,70,82,22,121,179,248,248,90,88,148,22,0,0,0,38,227,252,208,146,250,248,90,3,36,19,0,0,0,13,84,50,0,0,5,129,177,243,248,248,250,251,202,56,3,34,
+16,7,61,37,0,74,185,198,89,0,10,33,39,90,90,29,14,13,38,37,9,10,23,96,183,203,118,216,250,198,77,71,4,20,64,22,0,0,0,0,0,3,113,155,22,0,0,0,
+0,0,19,166,175,80,35,4,0,5,36,9,40,107,213,251,221,30,61,52,138,179,149,78,21,0,9,82,71,2,0,0,0,12,34,70,82,22,121,135,12,0,0,88,148,22,0,0,
+0,22,130,156,22,69,70,3,0,3,36,19,0,0,0,13,84,50,0,81,243,252,252,248,245,82,66,175,176,56,3,34,16,7,61,37,0,74,185,198,89,0,10,33,39,90,90,29,
+14,13,38,37,9,10,23,107,239,254,225,61,82,19,66,71,0,0,22,64,22,0,0,0,3,36,19,91,147,22,0,0,0,15,86,105,160,125,17,38,6,0,0,45,88,102,102,102,
+79,128,250,252,253,252,235,72,60,26,78,71,2,0,0,0,0,4,42,37,57,166,143,11,94,248,248,90,88,148,22,0,18,198,248,229,164,22,138,250,248,112,19,0,0,0,13,84,
+50,0,0,0,0,85,249,252,248,249,251,202,64,0,0,1,36,65,36,0,74,178,178,90,62,27,29,41,87,24,26,99,153,54,43,40,13,37,62,145,139,193,241,250,206,110,70,1,
+0,0,22,64,22,0,0,0,3,36,19,91,147,22,0,0,0,15,86,105,160,125,17,38,6,0,0,45,88,102,107,210,250,226,71,138,179,138,18,23,60,26,78,71,2,0,0,0,
+0,4,42,37,57,166,143,11,0,0,0,0,88,148,22,0,0,0,22,130,156,22,69,69,8,34,19,0,0,0,13,84,50,0,81,243,248,248,252,252,242,102,174,176,64,0,0,1,
+36,65,36,0,74,178,178,90,62,27,29,41,87,24,26,99,153,54,43,40,13,37,76,230,252,242,184,78,48,102,70,1,0,0,0,22,64,22,0,3,36,19,0,0,91,147,22,0,
+16,86,102,72,11,124,110,16,38,3,22,89,102,85,31,88,102,92,179,253,252,249,248,234,75,101,76,0,0,0,0,0,6,38,12,19,144,161,88,13,0,94,248,248,90,88,150,39,
+198,248,203,38,130,156,22,137,250,248,90,0,0,13,84,50,0,0,0,0,5,217,248,252,252,251,200,57,28,18,0,10,60,37,0,74,178,178,74,0,28,70,52,84,28,0,0,30,
+124,179,59,19,61,65,159,51,26,219,253,237,129,84,78,11,0,0,0,22,64,22,0,3,36,19,0,0,91,147,22,0,16,86,102,72,11,124,110,16,38,3,22,89,102,85,31,93,
+210,251,237,187,138,18,0,0,27,101,76,0,0,0,0,0,6,38,12,19,144,161,88,13,0,0,0,0,0,88,150,22,0,0,0,22,130,156,22,68,86,18,0,0,0,13,84,50,
+0,81,243,248,248,248,243,208,252,250,197,57,28,18,0,10,60,37,0,74,178,178,74,0,28,70,52,84,28,0,0,30,124,179,59,19,61,78,234,249,205,78,175,180,121,84,78,11,
+12,0,0,0,22,63,23,31,19,0,0,0,0,91,147,37,90,102,69,6,0,9,42,1,10,46,89,102,82,37,18,62,106,185,199,182,249,248,248,248,238,114,58,20,0,0,0,4,
+36,14,1,128,141,39,55,82,13,0,94,248,248,90,118,233,249,203,18,0,22,129,157,48,142,250,248,90,13,84,50,0,46,22,0,0,0,27,221,249,253,221,61,0,2,32,24,58,
+37,0,74,178,178,74,0,10,29,53,102,43,0,0,0,0,52,125,169,62,66,172,56,18,207,248,210,200,199,79,63,87,12,0,0,0,22,63,23,31,19,0,0,0,0,91,147,37,
+90,102,69,6,0,9,42,1,10,46,89,102,82,37,18,62,111,235,253,239,42,0,0,9,78,76,58,20,0,0,0,4,36,14,1,128,141,39,55,82,13,0,0,0,0,1,107,156,
+22,0,0,0,22,129,157,48,75,67,3,0,13,84,50,0,112,244,248,248,248,243,81,47,229,254,243,72,2,32,24,58,37,0,74,178,178,74,0,10,29,53,102,43,0,0,0,0,
+52,125,169,62,79,237,249,203,18,0,69,198,199,79,63,87,87,12,0,0,0,22,75,33,0,0,0,0,0,0,103,184,114,93,23,0,0,0,0,0,22,91,102,83,10,8,72,55,
+146,206,185,80,101,248,248,250,250,230,66,64,23,0,0,2,7,2,116,130,8,14,34,55,82,13,0,94,248,248,216,251,234,39,0,0,0,22,137,161,22,138,250,248,143,50,0,0,
+24,64,20,0,0,0,68,243,198,146,135,11,0,11,72,44,0,74,178,178,74,0,10,34,41,83,44,58,23,0,0,2,3,29,118,172,161,56,54,208,248,195,80,121,180,169,22,64,
+87,12,0,0,0,22,75,33,0,0,0,0,0,0,103,184,114,93,23,0,0,0,0,0,22,91,102,83,10,8,72,55,146,208,235,251,221,27,9,82,71,1,20,64,23,0,0,2,
+7,2,116,130,8,14,34,55,82,13,0,0,0,0,4,109,154,22,0,0,0,22,137,161,22,69,66,19,82,50,0,81,244,250,248,248,243,81,46,173,171,200,252,239,68,11,72,44,
+0,74,178,178,74,0,10,34,41,83,44,58,23,0,0,2,3,29,118,178,234,249,211,24,0,3,70,121,180,169,22,64,64,87,12,0,3,30,34,60,22,0,0,0,0,17,88,158,
+175,44,61,19,0,0,0,24,92,102,84,38,13,59,52,152,183,145,102,102,65,114,250,250,248,248,230,64,55,5,0,0,2,117,130,8,0,0,14,33,55,82,13,0,105,248,248,219,
+121,156,22,0,3,30,34,128,156,22,138,251,249,90,0,0,0,23,64,18,0,46,175,178,54,2,130,140,21,59,36,30,87,178,178,74,0,10,34,40,88,28,0,23,55,5,0,0,
+0,0,72,193,170,62,210,249,196,78,71,3,71,60,1,0,64,87,12,0,3,30,34,60,22,0,0,0,0,17,88,158,175,44,61,19,0,0,0,24,92,102,84,38,13,59,52,152,
+183,145,107,208,250,223,98,71,2,0,0,23,55,5,0,0,2,117,130,8,0,0,14,33,55,82,13,0,0,0,0,1,111,156,22,0,3,30,34,128,156,22,69,102,48,0,81,243,
+248,249,250,244,81,46,175,176,54,2,191,252,240,111,36,30,87,178,178,74,0,10,34,40,88,28,0,23,55,5,0,0,0,0,84,241,252,213,31,36,11,68,71,3,71,60,1,0,
+0,64,86,16,31,19,0,22,64,22,0,0,18,89,102,69,96,146,42,64,18,0,12,89,102,81,9,17,73,53,138,180,154,30,16,88,102,96,144,248,248,248,248,230,45,0,0,3,
+118,128,8,0,0,0,0,13,33,55,82,30,198,248,248,248,92,112,155,23,36,19,0,22,127,161,88,146,250,248,90,0,0,0,24,56,57,175,176,55,0,0,5,132,158,40,0,76,
+189,184,74,0,10,34,42,88,28,0,0,0,4,0,0,0,0,55,158,69,128,238,249,197,97,71,2,0,0,0,0,0,0,64,86,16,31,19,0,22,64,22,0,0,18,89,102,69,
+96,146,42,64,18,0,12,89,102,81,9,17,73,53,138,180,154,30,16,94,208,251,230,32,0,0,0,0,4,0,0,3,118,128,8,0,0,0,0,13,33,55,82,13,0,0,0,0,
+3,112,155,23,36,19,0,22,127,161,88,83,64,83,243,248,248,248,244,119,57,175,176,55,0,0,5,193,253,241,68,76,189,184,74,0,10,34,42,88,28,0,0,0,4,0,0,0,
+0,69,233,250,227,175,55,14,88,71,2,0,0,0,0,0,0,0,63,98,26,0,0,0,22,64,18,17,89,102,69,4,0,93,145,43,62,28,76,102,80,9,8,59,58,153,181,138,
+21,36,10,26,102,102,67,110,248,248,248,248,230,41,4,119,127,7,0,0,0,0,0,0,13,33,69,216,248,203,105,248,248,92,110,167,36,0,0,0,31,155,173,24,137,250,248,90,
+0,0,0,60,176,176,45,0,0,0,9,66,166,136,78,178,179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,0,55,159,50,18,213,251,235,113,74,35,5,0,0,0,0,0,
+0,0,63,98,26,0,0,0,22,64,18,17,89,102,69,4,0,93,145,43,62,28,76,102,80,9,8,59,58,153,181,138,21,36,10,26,107,208,250,221,31,0,0,0,0,0,4,119,
+127,7,0,0,0,0,0,0,13,33,55,82,13,0,0,0,0,2,110,167,36,0,0,0,31,155,173,24,128,246,248,248,248,243,81,60,176,176,45,0,0,0,9,66,210,252,244,199,
+179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,0,69,234,249,203,46,121,171,104,74,35,5,0,0,0,0,0,0,2,30,70,84,12,0,0,0,18,67,91,102,68,4,0,
+0,0,93,145,42,87,102,78,9,8,62,52,138,183,156,24,0,1,35,80,69,86,102,68,115,248,248,248,248,231,142,126,6,0,0,0,0,0,0,8,0,30,206,250,220,30,0,94,
+248,248,112,117,154,22,0,13,80,61,125,156,22,138,250,248,90,0,46,174,176,82,12,0,0,10,58,81,102,182,192,179,74,2,38,42,40,88,28,0,0,0,0,0,0,0,0,55,
+159,50,18,207,248,201,138,189,56,12,38,6,0,0,0,0,0,2,30,70,84,12,0,0,0,18,67,91,102,68,4,0,0,0,93,145,42,87,102,78,9,8,62,52,138,183,156,24,
+0,1,35,80,69,91,208,250,221,31,0,0,0,4,121,126,6,0,0,0,0,0,0,8,0,13,33,55,82,13,0,0,0,2,34,117,154,22,0,13,80,61,125,188,244,250,250,248,
+243,81,46,174,176,82,12,0,0,10,58,81,102,218,253,250,122,2,38,42,40,88,28,0,0,0,0,0,0,0,0,69,234,249,203,18,0,30,131,189,56,12,38,6,0,0,0,0,
+3,36,17,0,64,87,12,0,0,18,92,102,75,4,0,0,0,0,0,93,145,45,85,24,6,62,52,138,179,138,31,38,3,7,79,86,14,14,89,102,68,115,248,248,248,252,240,47,
+0,0,0,0,0,0,0,29,40,198,248,210,69,82,13,0,96,249,248,91,111,154,32,84,50,0,21,130,157,24,138,250,248,120,175,176,45,24,59,13,8,62,35,12,128,204,205,105,
+1,8,32,58,92,25,0,0,0,0,0,0,0,0,55,159,50,18,207,248,195,75,76,118,172,57,14,38,6,0,0,0,3,36,17,0,64,87,12,0,0,18,92,102,75,4,0,0,
+0,0,0,93,145,45,85,24,6,62,52,138,179,138,31,38,3,7,79,86,14,14,93,208,250,221,31,0,6,122,124,6,0,0,0,0,0,0,0,29,24,0,13,33,55,82,13,0,
+3,36,18,1,111,154,32,84,50,0,95,249,252,249,250,246,83,45,175,176,45,24,59,13,8,62,35,12,128,204,231,251,239,69,32,58,92,25,0,0,0,0,0,0,0,0,69,234,
+249,203,18,0,3,65,76,118,172,57,14,38,6,0,0,0,36,19,0,0,0,64,87,10,18,90,102,74,49,3,0,0,0,0,0,0,95,145,39,57,60,50,138,179,138,18,0,12,
+36,80,68,8,33,13,15,89,102,69,120,248,252,252,248,221,41,0,0,0,0,0,0,19,205,249,203,42,112,71,82,15,33,106,248,248,90,115,185,66,0,0,0,23,124,149,25,134,
+250,253,204,47,0,0,25,59,60,34,0,74,181,202,146,89,46,30,40,84,52,13,0,0,0,0,0,0,0,53,159,50,18,207,248,195,80,70,1,28,125,173,58,14,38,6,0,3,
+36,19,0,0,0,64,87,10,18,90,102,74,49,3,0,0,0,0,0,0,95,145,39,57,60,50,138,179,138,18,0,12,36,80,68,8,33,13,15,93,208,250,221,40,122,116,6,0,
+0,0,0,0,0,0,0,1,33,24,0,25,112,71,82,15,33,18,0,0,0,115,185,66,0,81,243,249,251,252,244,125,83,173,176,47,0,0,25,59,60,34,0,74,181,202,146,174,
+249,241,93,84,52,13,0,0,0,0,0,0,0,67,234,249,203,18,0,3,70,70,1,28,125,173,58,14,38,6,0,3,19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,0,
+0,0,0,0,0,95,147,76,81,143,179,138,18,0,0,7,83,88,7,0,3,36,13,15,89,102,73,187,252,248,248,248,221,36,0,0,0,0,18,198,248,210,40,93,183,150,66,88,
+24,0,94,248,248,143,134,154,22,0,0,0,4,88,145,71,203,253,249,90,0,0,7,65,70,12,74,178,178,81,78,102,94,63,83,26,0,36,19,0,0,0,0,0,44,148,48,18,
+207,248,195,80,71,3,0,0,29,124,173,58,14,36,9,34,19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,0,0,0,0,0,0,95,147,76,81,143,179,138,18,0,0,7,
+83,88,7,0,3,36,13,15,92,208,250,237,141,1,0,0,0,0,0,0,0,0,0,0,1,33,24,93,183,150,66,88,24,0,0,0,12,82,134,154,96,243,248,248,248,247,180,71,
+172,176,48,0,0,0,7,65,70,12,74,178,178,81,78,102,176,250,244,82,0,36,19,0,0,0,0,0,59,231,249,203,18,0,3,70,71,3,0,0,29,124,173,58,14,36,9,34,
+0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0,0,0,0,0,0,10,128,150,151,197,144,18,0,0,9,82,68,16,36,6,0,3,36,13,15,92,176,160,131,248,248,248,
+248,221,31,0,0,18,198,248,203,19,33,46,140,183,159,65,75,13,0,102,250,249,91,111,156,22,0,0,0,0,113,209,173,145,250,248,90,10,58,33,28,118,182,178,74,0,18,88,
+102,102,58,0,0,3,36,19,0,0,0,53,148,40,18,207,248,195,80,70,3,0,0,0,0,29,118,168,59,14,58,21,0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0,
+0,0,0,0,0,10,128,150,151,197,144,18,0,0,9,82,68,16,36,6,0,3,36,13,15,95,230,253,222,36,0,0,0,0,0,0,0,0,0,0,0,1,33,46,140,183,159,65,
+75,13,0,13,84,49,2,157,250,249,248,248,243,81,113,209,173,81,64,2,0,10,58,33,28,118,182,178,74,0,18,88,102,180,250,239,63,3,36,19,0,0,0,68,231,249,203,18,
+0,3,70,70,3,0,0,0,0,29,118,168,59,14,58,21,6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5,1,0,0,0,10,62,48,162,179,152,73,12,0,9,82,71,
+3,0,14,38,7,0,3,36,18,131,170,106,70,128,248,248,248,248,221,27,18,198,248,203,18,0,1,32,41,153,187,147,62,78,26,80,126,248,248,92,112,156,22,0,0,45,169,190,
+154,23,138,250,248,128,35,0,74,188,197,82,0,10,29,51,102,102,88,44,4,0,3,36,19,0,55,159,48,18,207,248,195,80,69,1,0,0,0,0,0,0,9,73,168,82,28,34,
+6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5,1,0,0,0,10,62,48,162,179,152,73,12,0,9,82,71,3,0,14,38,7,0,3,36,18,131,171,206,250,222,36,0,
+0,0,0,0,0,0,0,0,0,0,1,32,41,153,187,147,62,78,26,80,50,0,81,243,251,252,249,243,81,45,169,190,154,23,69,67,15,59,35,0,74,188,197,82,0,10,29,51,
+102,102,173,249,239,63,3,36,19,0,69,234,249,203,18,0,3,70,69,1,0,0,0,0,0,0,9,73,168,82,28,34,38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32,
+2,0,0,10,62,52,138,179,159,134,46,59,20,79,71,2,0,0,0,14,38,6,0,8,142,131,20,88,102,70,132,248,248,248,248,228,206,248,203,18,0,0,0,1,54,54,142,182,
+144,69,102,54,0,94,248,248,92,112,156,20,43,175,175,62,85,148,23,138,251,249,90,53,179,178,97,60,20,30,38,85,36,76,102,90,44,2,0,3,36,70,159,50,18,207,248,196,
+80,68,3,41,14,0,0,0,0,0,0,1,90,172,60,15,38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32,2,0,0,10,62,52,138,179,159,134,46,59,20,79,71,2,
+0,0,0,14,38,6,0,8,142,131,20,91,205,250,222,36,0,0,2,43,14,0,0,0,0,0,0,1,54,54,142,182,144,69,102,54,0,81,243,248,248,251,250,95,43,175,175,62,
+85,148,23,70,96,36,0,53,179,178,97,60,20,30,38,85,36,76,102,177,249,239,63,3,36,83,234,249,203,18,0,6,70,68,3,41,14,0,0,0,0,0,0,1,90,172,60,15,
+14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4,0,0,10,62,52,138,179,139,25,92,143,51,99,72,1,0,0,0,0,0,14,38,11,123,126,41,13,15,88,102,70,138,
+248,248,249,249,248,208,18,0,0,0,2,34,20,29,42,145,186,174,84,76,12,0,94,248,248,92,105,160,174,173,62,0,0,88,152,74,146,250,248,100,124,79,0,37,68,44,85,30,
+0,10,79,102,90,43,2,0,57,173,65,18,207,248,194,57,68,2,47,51,6,0,0,0,0,0,2,34,20,69,168,60,14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4,
+0,0,10,62,52,138,179,139,25,92,143,51,99,72,1,0,0,0,0,0,14,38,11,123,126,41,13,15,91,205,250,222,41,3,50,50,6,0,0,0,0,0,2,34,20,29,42,145,
+186,174,84,76,89,243,248,248,248,243,152,160,174,173,62,0,0,88,152,74,82,66,2,15,124,79,0,37,68,44,85,30,0,10,79,102,177,249,239,58,71,237,249,203,18,0,0,46,
+68,2,47,51,6,0,0,0,0,0,2,34,20,69,168,60,61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0,0,10,62,52,138,179,138,22,36,7,102,176,93,56,10,0,
+0,0,0,0,0,19,143,127,6,3,36,9,16,88,102,70,140,249,249,248,248,219,27,0,0,2,35,21,0,1,30,48,178,195,142,63,82,13,0,94,248,248,118,193,209,76,0,0,
+0,10,129,163,25,138,250,248,111,8,8,29,57,102,38,0,0,0,10,79,102,90,44,57,159,52,51,210,248,194,14,6,3,48,50,2,0,0,0,0,0,2,35,21,0,1,71,167,
+61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0,0,10,62,52,138,179,138,22,36,7,102,176,93,56,10,0,0,0,0,0,0,19,143,127,6,3,36,9,16,91,205,250,
+223,81,50,2,0,0,0,0,0,2,35,21,0,1,30,48,178,195,142,124,247,248,248,248,243,81,43,193,209,76,0,0,0,10,129,163,25,69,69,4,33,8,8,29,57,102,38,0,
+0,0,10,79,102,177,249,244,238,249,210,32,0,0,0,6,3,48,50,2,0,0,0,0,0,2,35,21,0,1,71,167,168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0,
+10,62,52,138,179,138,18,0,8,37,81,140,144,50,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,16,86,102,100,232,248,248,248,248,212,27,2,35,20,0,0,0,12,86,
+74,147,183,143,63,82,13,0,94,249,253,200,133,151,22,0,10,62,37,88,148,24,138,250,248,115,36,37,83,56,51,4,0,0,0,10,79,102,126,175,52,18,207,248,194,14,0,1,
+49,50,2,0,0,0,0,0,2,35,20,0,0,0,1,71,168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0,10,62,52,138,179,138,18,0,8,37,81,140,144,50,58,4,
+0,0,0,0,5,123,131,43,6,0,2,7,0,16,90,202,250,227,42,0,0,0,0,0,2,35,20,0,0,0,12,86,74,147,205,250,250,250,248,243,81,46,174,170,133,151,22,0,
+10,62,37,88,148,24,70,68,9,38,36,37,83,56,51,4,0,0,0,10,79,102,198,252,249,214,20,7,0,0,0,1,49,50,2,0,0,0,0,0,2,35,20,0,0,0,1,71,
+70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23,58,52,138,179,138,18,0,0,8,81,88,11,99,142,31,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,18,109,
+221,250,229,248,248,248,248,207,59,20,0,0,0,13,84,48,28,45,148,183,141,63,82,13,44,204,253,250,93,110,154,30,62,37,0,0,88,148,24,137,250,249,126,88,28,0,16,2,
+0,0,0,0,10,117,197,123,58,207,248,194,14,0,2,50,50,2,0,0,0,0,0,2,36,20,0,0,0,0,0,1,70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23,
+58,52,138,179,138,18,0,0,8,81,88,11,99,142,31,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,18,101,202,250,222,41,0,0,0,2,36,20,0,0,0,13,84,48,
+28,111,250,253,252,250,247,90,44,175,176,60,4,110,154,30,62,37,0,0,88,148,24,68,69,36,56,88,28,0,16,2,0,0,0,0,10,127,242,251,249,240,58,0,0,0,2,50,
+50,2,0,0,0,0,0,2,36,20,0,0,0,0,0,1,1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102,58,138,179,138,18,0,0,9,82,69,13,36,10,99,141,17,
+0,0,5,123,124,6,0,0,15,38,6,0,0,2,60,210,250,224,84,151,248,248,248,249,211,22,0,0,13,84,48,0,0,33,46,150,183,140,57,89,174,176,133,248,248,91,112,175,
+55,0,0,0,0,88,148,32,146,250,250,125,7,0,0,0,0,0,0,0,55,163,113,113,224,249,194,14,0,2,50,50,2,0,0,0,0,0,3,36,20,0,0,0,0,0,0,0,
+1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102,58,138,179,138,18,0,0,9,82,69,13,36,10,99,141,17,0,0,5,123,124,6,0,0,15,38,6,0,0,2,45,54,
+88,202,250,227,41,0,3,36,20,0,0,0,13,84,48,0,81,245,249,252,253,250,120,89,174,176,62,0,0,1,112,175,55,0,0,0,0,88,148,32,83,77,80,54,7,0,0,0,
+0,0,0,0,69,235,251,224,183,249,239,58,0,2,50,50,2,0,0,0,0,0,3,36,20,0,0,0,0,0,0,0,0,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82,
+174,183,138,18,0,0,8,82,71,3,0,10,39,11,100,142,14,1,123,124,6,0,0,0,0,15,38,4,1,64,209,248,206,98,102,72,151,248,249,248,248,207,18,13,84,56,9,0,
+0,1,33,47,151,182,151,170,174,66,0,94,248,248,129,112,148,22,0,0,0,0,94,161,58,158,250,248,114,11,0,0,0,0,0,55,159,50,27,222,251,216,55,1,1,50,50,2,
+0,0,0,0,0,3,35,19,0,0,0,0,0,6,13,0,0,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82,174,183,138,18,0,0,8,82,71,3,0,10,39,11,100,142,
+14,1,123,124,6,0,0,0,0,15,38,4,1,50,50,0,15,90,202,250,226,41,35,19,0,0,0,13,84,56,9,81,243,248,249,249,250,205,151,170,174,66,0,0,0,9,60,112,
+148,22,0,0,0,0,94,161,58,102,75,8,36,11,0,0,0,0,0,69,234,249,205,91,102,177,249,239,55,50,50,2,0,0,0,0,0,3,35,19,0,0,0,0,0,6,13,0,
+0,0,1,69,166,65,11,47,36,2,0,0,10,62,52,138,194,177,30,0,0,9,81,71,2,0,0,0,10,39,11,98,130,119,119,6,0,0,0,0,0,0,14,33,63,209,248,203,
+18,16,86,102,72,168,248,248,248,248,209,96,48,9,60,20,0,0,1,32,42,162,209,201,87,75,12,0,101,250,249,90,88,148,22,0,0,10,30,113,184,50,135,250,248,114,11,0,
+0,0,55,159,50,18,207,248,213,110,90,41,45,49,2,0,0,0,0,0,3,36,18,0,0,0,0,0,0,14,62,20,0,0,1,69,166,65,11,47,36,2,0,0,10,62,52,138,
+194,177,30,0,0,9,81,71,2,0,0,0,10,39,11,98,130,119,119,6,0,0,0,0,0,0,14,33,48,49,2,0,0,16,89,199,250,230,54,0,0,0,13,84,48,9,122,244,
+248,248,248,245,111,162,209,201,87,75,12,0,11,62,37,0,88,148,22,0,0,10,30,113,184,50,64,67,9,37,11,0,0,0,69,234,249,203,18,10,79,102,181,249,242,92,2,0,
+0,0,0,0,3,36,18,0,0,0,0,0,0,14,62,20,20,0,0,1,69,165,75,41,36,5,0,7,60,52,138,179,138,65,84,11,7,82,71,2,0,0,0,0,0,9,39,12,
+159,179,20,0,0,0,0,0,0,0,0,68,212,248,203,18,0,0,14,85,102,78,160,248,248,248,250,217,18,0,22,60,16,0,0,0,61,175,207,197,131,59,81,20,56,118,248,248,
+90,88,148,22,10,33,38,88,108,148,24,138,250,248,114,11,0,55,159,50,18,207,248,194,24,78,102,96,65,3,0,0,0,0,0,3,36,19,0,0,0,0,0,0,0,0,23,64,
+20,0,0,1,69,165,75,41,36,5,0,7,60,52,138,179,138,65,84,11,7,82,71,2,0,0,0,0,0,9,39,12,159,179,20,0,0,0,0,0,0,0,0,54,65,6,0,0,
+0,0,14,88,199,250,226,41,0,13,84,50,0,81,244,250,248,248,243,81,61,175,207,197,131,59,81,20,56,37,0,0,0,88,148,22,10,33,38,88,108,148,24,70,67,9,37,11,
+0,69,234,249,203,18,0,0,10,78,102,183,250,239,54,0,0,0,0,3,36,19,0,0,0,0,0,0,0,0,23,64,64,19,0,0,0,76,176,66,13,38,6,4,38,138,179,138,
+18,0,48,79,78,68,2,0,0,0,0,0,0,0,14,141,120,96,137,15,0,0,0,0,0,2,64,209,248,210,21,0,0,0,0,42,88,102,72,160,248,250,249,248,203,18,0,19,
+59,18,0,45,174,172,95,154,183,134,58,87,33,0,94,248,248,90,88,152,53,38,88,30,0,88,148,24,138,250,248,114,64,159,50,18,207,248,194,14,0,12,93,102,88,42,2,0,
+0,0,3,36,19,0,0,0,0,0,0,0,90,122,0,23,64,19,0,0,0,76,176,66,13,38,6,4,38,138,179,138,18,0,48,79,78,68,2,0,0,0,0,0,0,0,14,141,
+120,96,137,15,0,0,0,0,0,2,50,48,16,35,4,0,0,0,0,42,91,199,250,230,50,84,50,0,81,243,248,248,250,244,81,45,174,172,95,154,183,134,58,87,33,0,0,0,
+0,0,88,152,53,38,88,30,0,88,148,24,70,67,9,37,77,234,249,203,18,0,0,0,0,12,93,102,180,249,239,54,0,0,3,36,19,0,0,0,0,0,0,0,0,0,0,23,
+24,64,18,0,18,33,65,166,66,14,38,23,138,179,138,18,0,0,6,94,102,15,0,0,0,0,0,0,0,5,123,129,42,11,102,140,15,0,0,0,2,64,209,248,203,51,74,6,
+0,3,36,15,14,86,102,77,188,249,248,248,248,198,18,0,23,56,57,175,176,60,27,52,157,183,132,58,80,13,0,94,248,248,96,110,164,102,30,0,0,0,88,148,24,138,250,249,
+201,59,18,207,248,194,14,0,2,46,51,77,102,91,43,2,0,3,36,19,0,0,0,0,0,0,0,90,248,248,45,0,24,64,18,0,18,33,65,166,66,14,38,23,138,179,138,18,
+0,0,6,94,102,15,0,0,0,0,0,0,0,5,123,129,42,11,102,140,15,0,0,0,2,49,50,2,0,35,74,6,0,3,36,15,14,89,199,250,238,81,0,81,243,248,248,248,
+244,119,57,175,176,60,27,52,157,183,132,58,80,13,0,0,0,0,10,110,164,102,30,0,0,0,88,148,24,70,68,75,237,249,203,18,0,0,0,0,2,46,51,77,102,181,249,239,
+54,3,36,19,0,0,0,0,0,0,0,0,0,0,0,0,0,25,60,31,32,2,0,67,166,62,29,156,181,138,18,0,0,9,82,66,48,82,13,0,0,0,0,0,5,123,124,6,
+9,39,11,102,140,15,0,2,66,209,248,203,18,6,71,76,10,33,19,0,0,12,84,102,91,164,248,248,248,248,194,18,0,60,176,176,60,0,0,33,53,157,183,131,58,82,13,0,
+94,248,249,114,146,161,22,0,0,0,0,88,148,21,162,253,249,124,209,248,194,14,0,2,50,50,25,121,88,102,91,42,5,34,19,0,0,0,0,0,0,0,90,248,248,94,0,0,
+0,25,60,31,32,2,0,67,166,62,29,156,181,138,18,0,0,9,82,66,48,82,13,0,0,0,0,0,5,123,124,6,9,39,11,102,140,15,0,2,52,50,1,0,0,6,71,76,
+10,33,19,0,0,12,87,197,250,230,108,243,248,248,248,243,81,60,176,176,60,0,0,33,53,157,183,131,58,82,13,0,0,10,34,38,146,161,22,0,0,0,0,88,148,21,116,240,
+249,211,28,0,0,0,0,2,50,50,25,121,88,102,181,249,239,81,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,75,18,0,0,1,62,154,150,183,156,24,0,0,
+9,82,71,2,0,50,84,13,0,0,0,5,123,124,6,0,0,9,39,12,102,140,17,61,216,250,203,18,0,0,2,70,90,19,0,0,0,10,80,92,102,77,169,248,248,248,248,194,
+56,174,176,87,15,0,0,1,33,54,159,183,130,57,82,12,7,115,249,250,110,88,148,22,0,0,0,0,81,152,150,158,250,248,249,197,14,0,2,50,50,24,148,91,13,79,102,90,
+59,17,0,0,0,0,0,0,0,90,248,248,94,0,0,0,0,0,36,75,18,0,0,1,62,154,150,183,156,24,0,0,9,82,71,2,0,50,84,13,0,0,0,5,123,124,6,0,
+0,9,39,12,102,140,17,46,82,67,2,0,0,0,2,70,90,19,0,0,0,10,80,95,197,250,248,248,248,248,243,81,45,174,176,87,15,0,0,1,33,54,159,183,130,57,82,12,
+7,34,38,88,30,88,148,22,0,0,0,0,81,160,231,251,217,26,37,12,0,0,2,50,50,24,148,91,13,79,102,183,250,235,54,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8,82,71,2,0,0,0,51,84,13,0,5,123,124,6,0,0,0,0,9,39,10,103,168,212,248,217,83,3,0,0,2,32,
+76,74,5,0,13,84,47,15,85,102,77,169,248,248,248,249,235,179,59,24,62,16,0,0,1,33,56,160,183,128,56,83,40,36,150,249,248,90,88,148,22,0,0,0,48,174,151,35,
+232,250,248,122,10,1,50,50,24,148,88,0,0,10,78,102,92,40,2,0,0,0,0,0,90,248,248,94,0,0,0,0,0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8,
+82,71,2,0,0,0,51,84,13,0,5,123,124,6,0,0,0,0,9,39,10,103,162,61,9,68,70,3,0,0,2,32,76,74,5,0,13,84,47,15,141,250,250,248,248,243,81,42,
+172,176,59,24,62,16,0,0,1,33,56,160,183,128,56,83,40,36,88,30,0,0,88,148,22,0,0,0,63,237,252,207,83,68,10,38,10,1,50,50,24,148,88,0,0,10,78,102,
+184,249,234,54,0,0,0,0,0,0,0,0,0,0,0,0,19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80,70,2,0,0,6,32,0,49,84,17,123,124,6,0,0,0,
+0,0,0,8,34,66,227,252,206,21,70,70,2,1,36,17,1,70,73,21,82,50,0,0,14,84,102,78,173,248,249,253,253,209,9,0,27,64,16,0,0,1,33,58,161,182,131,76,
+86,83,28,94,248,249,93,88,148,22,0,55,157,46,93,235,249,221,248,248,112,52,48,24,148,88,0,0,0,0,38,83,102,91,42,2,0,0,0,90,248,248,94,0,0,0,0,0,
+19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80,70,2,0,0,6,32,0,49,84,17,123,124,6,0,0,0,0,0,0,8,34,52,132,140,15,3,70,70,2,1,36,17,
+1,70,73,21,82,50,0,81,244,250,251,250,248,111,46,172,173,62,0,0,27,64,16,0,0,1,33,58,161,182,131,76,86,83,28,0,6,33,4,88,148,22,0,69,233,249,219,156,
+26,46,4,6,34,52,48,24,148,88,0,0,0,0,38,83,102,184,249,234,54,0,0,0,0,0,0,0,0,0,0,0,36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88,
+6,0,0,6,38,15,0,0,55,167,130,6,0,0,0,0,0,0,0,1,64,212,248,224,147,14,3,69,68,33,18,0,0,1,70,102,49,0,0,0,0,14,84,102,75,191,253,253,
+250,248,194,9,0,28,63,18,0,0,1,33,57,166,191,97,95,86,8,3,118,248,248,90,88,136,69,151,50,18,207,250,229,35,94,248,249,132,32,148,88,0,0,0,3,36,16,9,
+79,102,91,42,2,0,90,248,248,94,0,0,0,0,0,18,36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88,6,0,0,6,38,15,0,0,55,167,130,6,0,0,0,0,
+0,0,0,1,49,65,11,105,139,14,3,69,68,33,18,0,0,1,70,102,49,0,81,243,248,248,250,250,250,235,189,174,59,0,0,0,0,28,63,18,0,0,1,33,57,166,191,97,
+95,86,8,3,38,15,0,0,88,136,82,232,249,203,18,88,148,22,0,1,49,65,32,148,88,0,0,0,3,36,16,9,79,102,184,249,234,54,0,0,0,0,0,0,0,0,0,18,
+3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15,33,4,4,35,14,0,0,5,123,149,82,11,0,0,0,0,0,0,3,59,209,248,210,27,105,138,14,3,81,68,2,0,
+0,10,70,81,63,5,0,0,0,0,13,80,99,175,230,249,248,248,248,190,9,0,29,32,0,0,0,1,33,80,103,85,50,49,77,40,12,94,248,248,90,114,179,65,18,207,248,194,
+98,148,24,122,249,249,195,94,0,0,0,2,33,18,0,0,9,75,96,85,39,92,248,248,94,0,0,0,0,0,15,35,3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15,
+33,4,4,35,14,0,0,5,123,149,82,11,0,0,0,0,0,0,3,44,47,10,35,9,105,138,14,3,81,68,2,0,0,10,70,81,63,84,243,248,248,248,244,136,196,253,247,93,
+0,0,0,0,0,0,29,32,0,0,0,1,33,80,103,85,50,49,77,40,12,0,0,0,0,124,238,250,203,18,0,0,88,148,24,44,47,31,163,94,0,0,0,2,33,18,0,0,
+9,75,96,181,249,234,54,0,0,0,0,0,0,0,15,35,0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71,10,36,36,10,0,0,5,123,124,6,43,81,12,0,0,0,
+0,3,63,208,248,203,24,37,11,105,140,46,17,60,67,0,11,81,43,2,62,74,5,0,0,0,0,51,173,173,95,178,248,248,248,248,185,9,0,0,0,0,0,9,30,52,90,22,
+7,35,62,79,12,0,94,248,249,183,112,146,211,248,194,14,0,90,168,60,108,252,250,114,11,0,3,35,16,0,0,0,0,9,74,96,145,249,248,94,0,0,0,0,0,18,34,2,
+0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71,10,36,36,10,0,0,5,123,124,6,43,81,12,0,0,0,0,3,48,44,3,0,6,37,11,105,140,46,17,60,67,0,
+11,81,43,2,124,246,248,248,248,243,81,51,173,224,250,231,50,0,0,0,0,0,0,0,0,0,0,9,30,52,90,22,7,35,62,79,12,0,0,0,68,230,251,231,39,0,0,0,
+0,90,168,60,21,148,92,37,11,0,3,35,16,0,0,0,0,9,74,96,184,249,234,54,0,0,0,0,0,18,34,2,0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164,
+73,42,43,4,0,5,123,124,6,0,0,49,84,12,0,0,1,62,209,248,203,18,0,6,38,14,125,147,13,3,66,69,77,48,0,0,3,70,78,8,0,0,46,175,176,98,102,80,
+182,248,248,248,130,0,0,0,0,0,10,34,38,84,52,17,4,42,40,54,82,13,0,129,252,249,102,224,252,200,14,0,1,47,117,141,140,147,248,248,114,14,33,19,0,0,0,0,
+0,0,10,141,251,250,122,2,0,0,0,0,19,36,3,0,0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164,73,42,43,4,0,5,123,124,6,0,0,49,84,12,0,0,
+1,47,50,2,0,0,0,6,38,14,125,147,13,3,66,69,77,48,0,81,243,250,250,248,243,81,46,175,176,98,197,250,230,50,0,0,0,0,0,0,0,0,10,34,38,84,52,17,
+4,42,40,54,82,13,0,69,234,249,203,100,148,22,0,0,1,47,117,141,140,83,0,8,37,14,33,19,0,0,0,0,0,0,10,79,102,187,249,230,54,0,0,0,19,36,3,0,
+0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64,174,78,12,38,11,123,124,6,0,0,0,0,58,86,12,0,19,203,248,203,18,0,24,3,6,58,26,105,140,25,15,102,
+87,0,0,0,0,2,70,64,3,45,175,176,60,17,82,96,77,187,248,126,0,0,0,0,0,10,34,38,88,30,0,33,49,9,10,33,55,82,65,159,126,248,248,248,217,155,22,0,
+1,22,22,168,168,18,94,248,248,128,26,0,0,0,0,0,0,0,90,248,250,158,90,43,2,0,0,19,36,3,0,0,0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64,
+174,78,12,38,11,123,124,6,0,0,0,0,58,86,12,0,1,22,4,0,0,0,24,3,6,58,26,105,140,25,15,102,87,0,81,243,248,248,250,246,83,45,175,176,60,17,82,192,
+250,231,50,0,0,0,0,0,0,10,34,38,88,30,0,33,49,9,10,33,55,82,79,234,249,203,18,0,95,149,22,0,1,22,22,168,168,18,0,0,8,58,26,0,0,0,0,0,
+0,0,0,10,79,102,187,249,230,54,0,19,36,3,0,0,52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34,69,163,69,18,141,127,6,0,0,0,0,0,11,78,84,29,
+198,248,203,18,0,1,62,69,31,21,34,12,103,156,97,48,64,69,3,0,0,0,0,16,66,174,176,62,0,0,11,78,96,83,95,0,0,0,0,0,10,34,38,88,30,0,6,34,
+39,21,0,13,33,98,190,61,18,223,248,249,109,111,149,23,0,23,147,81,81,147,22,96,249,249,112,12,0,0,0,0,0,90,248,248,100,79,102,90,43,1,18,36,3,0,0,11,
+52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34,69,163,69,18,141,127,6,0,0,0,0,0,11,78,84,12,0,0,0,0,0,1,62,69,31,21,34,12,103,156,97,48,
+64,128,243,248,248,248,243,92,66,174,176,62,0,0,11,78,192,250,231,50,0,0,0,0,10,34,38,88,30,0,6,34,39,21,0,13,33,109,241,249,203,18,16,40,17,111,149,23,
+0,23,147,81,81,147,22,3,34,23,34,12,0,0,0,0,0,0,0,0,10,79,102,187,249,230,68,36,3,0,0,11,38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13,
+0,61,151,140,122,42,6,0,0,0,0,0,0,13,90,217,248,203,18,0,0,0,5,86,76,0,7,34,24,142,169,22,2,70,70,3,0,0,0,43,175,176,63,0,0,0,7,59,
+83,102,76,8,0,0,0,10,34,38,88,30,0,6,38,13,0,33,24,0,65,171,94,94,209,248,228,249,248,102,108,152,54,141,88,0,0,88,149,55,106,248,248,115,13,0,0,0,
+90,248,248,94,0,10,79,102,89,50,32,2,0,0,10,62,38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13,0,61,151,140,122,42,6,0,0,0,0,0,0,13,78,84,
+12,0,0,0,0,0,5,86,76,0,7,34,24,142,169,22,83,246,250,248,248,243,81,43,175,176,63,0,0,0,7,59,83,194,250,231,54,0,0,10,34,38,88,30,0,6,38,13,
+0,33,24,0,78,237,250,220,28,11,85,50,0,18,108,152,54,141,88,0,0,88,149,55,19,0,8,39,13,0,0,0,0,0,0,0,0,10,79,102,186,249,233,56,0,0,10,62,
+0,0,0,1,0,0,9,82,71,2,0,0,6,38,14,0,0,1,142,186,72,14,35,6,0,0,0,0,0,18,201,250,220,29,0,0,0,3,34,19,67,70,0,16,99,56,88,148,
+22,3,70,71,6,0,46,175,176,66,31,6,0,10,62,35,13,82,102,77,9,0,10,33,38,88,30,0,6,38,14,0,0,1,33,73,159,60,46,217,250,213,58,94,248,248,118,157,
+186,95,0,0,0,3,112,156,22,94,248,248,115,13,0,90,248,248,94,4,6,0,10,77,109,146,49,2,0,10,62,37,0,0,0,1,0,0,9,82,71,2,0,0,6,38,14,0,
+0,1,142,186,72,14,35,6,0,0,0,0,0,0,13,78,84,12,0,0,0,3,34,19,67,70,0,16,99,56,88,182,244,248,250,250,243,81,46,175,176,66,31,6,0,10,62,35,
+13,82,194,250,231,54,10,33,38,88,30,0,6,38,14,0,0,1,33,86,234,249,209,67,79,80,47,0,0,0,43,157,186,95,0,0,0,3,112,156,22,0,0,7,39,13,0,0,
+0,0,0,4,6,0,10,77,109,210,249,230,54,10,62,37,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,116,69,161,74,13,38,6,0,0,0,18,198,248,206,
+90,84,12,0,3,36,19,0,3,66,69,75,51,32,12,88,148,22,3,70,75,51,175,176,62,0,13,34,16,60,37,0,79,128,92,102,76,19,30,38,88,30,0,6,38,14,0,0,
+0,0,56,171,69,22,209,249,216,103,10,0,94,249,251,191,143,137,22,0,3,36,19,88,148,22,94,248,248,115,98,248,248,94,0,7,38,10,0,25,95,176,169,45,14,60,37,0,
+0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,116,69,161,74,13,38,6,0,0,0,0,0,0,13,78,84,12,0,3,36,19,0,3,66,69,75,51,32,89,247,
+252,249,248,246,132,51,175,176,62,0,13,34,16,60,37,0,79,128,92,191,250,232,77,38,88,30,0,6,38,14,0,0,0,0,69,237,249,203,26,41,94,94,10,0,0,30,101,156,
+143,137,22,0,3,36,19,88,148,22,0,0,7,39,13,0,0,0,0,7,38,10,0,25,95,176,221,249,231,98,37,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,
+123,124,6,1,61,165,74,14,38,6,0,18,198,248,203,18,13,78,84,16,32,19,0,0,0,15,102,87,0,5,38,13,88,148,23,0,85,176,176,60,0,0,0,20,73,38,0,74,
+178,179,63,80,102,87,44,84,30,0,6,38,14,0,0,0,0,55,159,51,52,211,248,214,77,53,81,11,27,160,252,250,102,111,149,24,36,19,0,0,88,148,22,94,248,248,249,248,
+94,0,0,0,10,35,24,29,15,82,175,168,74,35,0,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,124,6,1,61,165,74,14,38,6,0,0,0,0,0,0,
+13,78,84,16,32,19,0,0,0,15,102,87,0,85,245,248,250,252,244,81,85,176,176,60,0,0,0,20,73,38,0,74,178,179,63,80,191,250,234,120,30,0,6,38,14,0,0,0,
+0,69,234,249,210,36,11,85,67,53,81,11,27,105,161,87,19,111,149,24,36,19,0,0,88,148,22,0,0,7,38,13,0,0,0,0,10,35,24,29,15,82,175,220,250,234,50,0,
+0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,124,6,0,0,0,60,159,75,14,38,23,198,249,203,18,0,0,12,75,96,27,0,0,0,13,82,48,64,69,2,6,39,
+14,88,145,69,168,176,75,7,0,0,10,59,43,32,78,178,178,74,0,20,90,102,101,36,0,6,38,14,0,0,0,0,55,159,50,22,207,249,216,59,11,32,52,84,103,160,150,248,
+248,101,110,162,38,0,0,0,0,88,148,22,150,248,248,166,12,0,0,0,0,28,57,10,0,8,83,175,170,45,2,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,
+124,6,0,0,0,60,159,75,14,38,5,0,22,2,0,0,0,12,75,96,27,0,0,0,13,82,48,64,128,243,248,249,248,247,180,69,168,176,75,7,0,0,10,59,43,32,78,178,
+178,74,0,20,90,191,251,234,54,6,38,14,0,0,0,0,69,234,249,203,18,39,90,47,11,32,52,84,103,160,88,0,0,18,110,162,38,0,0,0,0,88,148,22,0,0,7,38,
+12,0,0,0,0,28,57,10,0,8,83,175,221,249,230,50,122,0,9,82,71,2,0,0,6,38,14,0,0,5,123,126,14,0,0,0,0,0,33,154,76,31,205,249,214,22,0,0,
+0,1,38,81,82,12,0,13,84,50,0,2,70,70,2,6,38,11,112,209,175,52,9,37,8,9,62,37,0,84,190,180,74,0,10,29,46,102,102,73,16,34,14,0,0,0,0,58,
+162,50,22,207,248,214,62,0,0,10,50,113,189,96,0,94,248,248,119,118,148,22,0,0,0,0,88,186,249,248,248,248,116,12,0,0,24,30,11,38,8,6,60,91,175,169,47,2,
+0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,126,14,0,0,0,0,0,33,154,76,14,32,44,53,4,0,0,0,1,38,81,82,12,0,13,84,50,0,83,246,250,248,248,
+245,88,112,209,175,52,9,37,8,9,62,37,0,84,190,180,74,0,10,29,46,102,191,250,235,81,14,0,0,0,0,72,235,249,203,18,12,83,50,0,0,10,50,113,189,96,0,0,
+0,1,45,118,148,22,0,0,0,0,88,148,22,0,0,12,41,12,0,0,24,30,11,38,8,6,60,91,175,221,249,230,248,95,82,70,2,0,0,6,38,14,0,0,5,123,124,21,
+61,15,0,36,72,9,0,30,161,216,249,217,27,0,0,0,3,36,15,10,78,81,26,80,50,0,0,0,3,70,70,1,2,66,168,190,160,20,0,8,38,61,35,0,74,178,182,100,
+2,9,33,38,84,39,76,102,90,20,0,0,0,0,55,165,99,36,207,248,214,62,0,0,0,24,111,178,124,81,13,0,96,249,248,100,111,149,22,0,0,0,90,250,252,105,94,249,
+250,115,10,21,33,1,0,8,38,61,32,11,82,175,169,47,0,8,82,70,2,0,0,6,38,14,0,0,5,123,124,21,61,15,0,36,72,9,0,30,154,77,49,69,10,0,0,0,
+3,36,15,10,78,81,26,80,50,0,81,243,248,250,250,243,82,66,168,190,160,20,0,8,38,61,35,0,74,178,182,100,2,9,33,38,84,39,76,191,250,236,54,0,0,0,69,235,
+251,206,18,13,83,50,0,0,0,24,111,178,124,81,13,0,3,36,16,16,111,149,22,0,0,0,0,86,141,16,0,43,76,39,10,21,33,1,0,8,38,61,32,11,82,175,221,249,
+249,250,134,2,0,0,6,38,14,0,0,5,123,124,6,0,30,63,16,72,102,78,8,18,205,252,227,34,35,6,0,3,36,19,0,0,10,77,102,68,37,0,0,0,0,3,69,64,
+46,174,175,64,86,148,22,8,61,56,7,74,178,178,74,10,38,33,37,88,30,0,16,92,102,77,10,0,0,55,159,48,49,219,248,212,98,16,0,0,0,80,174,98,31,55,81,17,
+32,106,248,248,102,112,149,22,0,90,248,248,142,136,22,98,250,250,121,36,0,0,0,8,61,56,7,0,10,82,175,168,50,77,69,2,0,0,6,38,14,0,0,5,123,124,6,0,
+30,63,16,72,102,78,8,0,30,171,115,17,35,6,0,3,36,19,0,0,10,77,102,68,37,5,217,248,248,248,246,124,46,174,175,64,86,148,22,8,61,56,7,74,178,178,74,10,
+38,33,37,88,30,0,16,92,188,250,235,54,0,69,234,249,209,76,21,76,88,16,0,0,0,80,174,98,31,55,81,17,32,19,0,0,19,112,149,22,0,0,0,0,76,136,22,6,
+67,73,48,36,0,0,0,8,61,56,7,0,10,82,175,215,205,250,248,90,0,6,38,14,0,0,5,123,124,6,0,0,0,28,57,56,90,102,88,200,249,219,162,79,14,36,9,34,
+19,0,0,0,10,81,88,104,159,53,0,0,0,0,0,84,175,174,57,31,14,88,152,79,35,9,101,181,178,74,0,6,37,56,86,29,0,6,34,23,78,102,78,10,55,159,48,22,
+207,249,209,83,43,5,0,0,64,170,90,0,13,32,55,95,28,0,94,248,248,102,112,149,105,248,248,94,0,85,147,22,95,250,250,114,12,0,10,62,35,9,38,10,0,10,80,175,
+175,87,4,0,0,6,38,14,0,0,5,123,124,6,0,0,0,28,57,56,90,102,75,11,43,77,155,79,14,36,9,34,19,0,0,0,10,81,88,104,159,53,27,221,248,243,81,84,
+175,174,57,31,14,88,152,79,35,9,101,181,178,74,0,6,37,56,86,29,0,6,34,23,78,188,250,235,110,234,249,203,18,27,62,73,43,5,0,0,64,170,90,0,13,32,55,95,
+28,0,0,0,0,19,112,149,22,0,0,0,0,85,147,22,1,76,85,37,12,0,10,62,35,9,38,10,0,10,80,175,175,200,249,248,93,38,14,0,0,5,123,124,6,0,0,0,
+0,1,59,73,30,89,221,250,214,21,29,152,79,14,58,21,0,0,0,13,84,48,12,77,120,162,52,0,0,0,45,172,175,90,0,4,22,11,128,163,23,69,181,190,81,0,11,34,
+34,90,55,1,5,38,14,0,11,80,102,117,163,48,22,207,248,194,70,74,17,0,1,64,171,91,0,0,0,13,52,68,81,13,0,94,248,248,102,163,252,249,94,0,0,0,88,148,
+42,113,250,250,105,9,62,37,0,0,10,39,10,0,19,105,175,168,46,1,5,38,14,0,0,5,123,124,6,0,0,0,0,1,59,73,30,76,102,88,53,3,29,152,79,14,58,21,
+0,0,0,13,84,48,12,77,120,162,52,27,217,81,45,172,175,90,0,4,22,11,128,163,23,69,181,190,81,0,11,34,34,90,55,1,5,38,14,0,11,80,188,251,252,249,203,18,
+0,1,59,74,17,0,1,64,171,91,0,0,0,13,52,68,81,13,0,0,0,0,19,112,149,22,0,0,0,0,88,148,42,30,66,76,23,9,62,37,0,0,10,39,10,0,19,105,
+80,175,201,249,249,98,0,0,5,123,124,6,0,0,0,0,3,50,44,28,68,204,250,224,86,5,0,29,153,100,28,32,6,0,13,84,50,0,0,13,77,119,162,53,0,46,175,175,
+56,64,69,0,6,59,36,81,156,173,175,81,35,16,30,33,84,28,8,36,36,11,0,0,0,10,117,197,114,31,207,248,195,61,44,28,59,16,58,170,91,0,0,0,3,31,27,30,
+55,82,13,0,94,248,248,248,251,188,22,0,0,0,0,102,162,22,96,250,250,126,35,0,0,0,0,10,33,16,76,68,80,175,169,47,32,12,0,0,5,123,124,6,0,0,0,0,
+3,50,44,28,54,28,89,102,92,22,0,29,153,100,28,32,6,0,13,84,50,0,0,13,77,119,162,53,5,46,175,175,56,64,69,0,6,59,36,81,156,173,175,81,35,16,30,33,
+84,28,8,36,36,11,0,0,0,10,127,249,251,246,69,0,3,50,44,28,59,16,58,170,91,0,0,0,3,31,27,30,55,82,13,0,0,0,0,19,110,149,22,0,0,0,0,102,
+162,22,2,66,68,55,35,0,0,0,0,10,33,16,76,68,9,82,175,202,249,248,105,5,123,124,6,0,0,0,0,4,52,46,1,18,204,250,214,92,102,72,5,0,61,160,80,13,
+34,20,83,50,0,0,0,0,16,77,118,158,83,169,175,55,0,2,67,70,55,33,0,69,179,179,86,0,16,52,40,81,25,0,6,42,38,20,23,0,0,55,163,114,90,208,248,195,
+63,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12,32,55,82,13,0,150,248,248,157,111,149,22,0,0,24,31,88,148,22,102,251,250,90,0,0,0,0,0,14,93,72,0,
+9,82,175,171,49,17,24,5,123,124,6,0,0,0,0,4,52,46,1,0,26,69,52,99,235,214,22,0,61,160,80,13,34,20,83,50,0,0,0,0,12,77,118,158,83,169,175,55,
+0,2,67,70,55,33,0,69,179,179,86,0,16,52,40,81,25,0,6,42,38,20,23,0,0,69,235,251,236,248,239,57,52,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12,
+32,55,82,13,0,0,0,0,18,111,149,22,0,0,24,31,88,148,22,12,96,82,1,0,0,0,0,0,14,93,72,0,0,10,83,175,201,250,248,169,124,6,0,0,0,0,4,53,
+48,2,18,198,249,215,66,28,81,102,70,34,17,28,152,81,18,94,52,0,0,0,0,81,217,38,73,133,208,182,52,0,0,0,12,96,83,1,74,178,173,123,135,32,31,42,99,35,
+0,0,14,9,26,58,8,0,55,159,48,30,208,248,195,64,48,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0,13,33,55,82,98,248,248,248,248,102,112,150,28,24,33,1,
+0,88,152,76,117,250,250,92,0,0,0,9,80,72,36,9,0,10,83,175,169,61,7,123,124,6,0,0,0,0,4,53,48,2,0,2,44,59,52,44,216,251,214,50,17,28,152,81,
+18,94,52,0,0,0,0,0,0,12,73,133,208,182,52,0,0,0,12,96,83,1,74,178,173,123,135,32,31,42,99,35,0,0,14,9,26,58,8,0,69,234,249,205,22,140,248,242,
+95,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0,13,33,55,82,13,0,0,0,0,19,112,150,28,24,33,1,0,88,152,76,36,66,69,3,0,0,0,9,80,72,36,9,
+10,0,8,87,173,197,252,252,94,0,0,0,0,4,54,47,1,18,198,249,213,21,25,59,30,82,102,75,2,0,28,152,82,32,35,6,0,0,81,243,248,221,88,184,170,168,50,0,
+0,10,60,36,65,123,179,178,72,0,94,162,57,86,37,30,7,0,0,17,33,16,36,60,159,48,22,207,248,195,65,47,1,0,2,66,170,90,25,64,16,1,36,19,0,0,0,0,
+0,13,33,126,250,248,94,94,248,248,102,109,88,32,1,0,0,10,129,164,22,96,250,250,163,95,14,82,70,1,8,39,10,0,8,87,173,163,138,122,6,0,0,0,0,4,54,47,
+1,0,2,49,51,3,25,59,46,216,251,215,20,0,28,152,82,32,35,6,0,0,0,0,0,0,68,184,170,168,50,0,0,10,60,36,65,123,179,178,72,0,94,162,57,86,37,30,
+7,0,0,17,33,16,36,73,234,249,203,18,0,4,164,249,239,58,2,66,170,90,25,64,16,1,36,19,0,0,0,0,0,13,33,55,82,13,0,0,0,0,18,109,88,32,1,0,
+0,10,129,164,22,2,70,72,114,95,14,82,70,1,8,39,39,8,13,38,84,205,221,249,248,90,0,0,5,54,46,1,18,199,249,213,21,0,0,26,57,48,86,102,68,4,0,27,
+152,82,14,38,6,81,243,248,248,250,245,157,87,113,162,52,10,62,37,0,75,199,199,76,0,10,33,113,185,50,0,7,37,8,17,36,3,0,66,173,53,22,207,248,195,65,46,1,
+0,4,67,170,90,0,0,26,61,42,15,0,0,0,0,0,0,0,98,249,250,146,13,0,94,248,248,112,55,2,0,0,10,62,37,88,148,20,96,252,253,199,94,70,2,0,0,10,
+39,8,13,38,84,205,201,51,2,0,0,0,5,54,46,1,0,4,49,51,3,0,0,26,57,63,217,251,213,22,0,27,152,82,14,38,6,0,0,0,0,60,190,154,87,113,162,52,
+10,62,37,0,75,199,199,76,0,10,33,113,185,50,0,7,37,8,17,36,3,0,79,237,249,203,18,0,5,54,46,140,248,239,110,170,90,0,0,26,61,42,15,0,0,0,0,0,
+0,0,13,33,55,82,13,0,0,0,0,35,55,2,0,0,10,62,37,88,148,20,3,150,199,169,94,70,2,0,0,10,8,46,38,5,124,158,170,199,249,248,90,5,54,46,0,18,
+198,249,213,21,0,0,0,0,48,62,32,83,102,67,4,0,27,151,83,14,107,243,248,248,250,252,187,50,14,77,117,167,98,37,0,74,189,185,121,67,14,31,38,88,108,148,22,0,
+7,46,38,2,0,55,159,59,57,208,248,195,66,46,0,0,0,61,170,90,0,0,0,0,48,66,15,0,0,0,0,1,55,94,248,248,115,55,82,13,0,94,249,249,101,35,1,9,
+62,37,0,0,111,145,117,207,253,251,133,1,0,0,0,0,8,46,38,5,124,158,170,167,47,3,0,5,54,46,0,0,0,43,51,3,0,0,0,0,48,62,48,216,251,213,21,0,
+27,151,83,14,38,6,0,0,60,190,155,50,14,77,117,167,98,37,0,74,189,185,121,67,14,31,38,88,108,148,22,0,7,46,38,2,0,69,234,249,211,24,0,5,54,46,0,0,
+135,250,250,128,0,0,0,0,48,66,15,0,0,0,0,1,55,6,0,13,33,55,82,13,0,0,24,29,17,35,1,9,62,37,0,0,111,145,117,179,187,124,66,1,0,0,0,0,
+17,38,40,128,124,12,80,176,201,249,248,125,45,0,18,198,248,206,22,0,0,0,3,36,15,24,59,34,85,102,66,3,0,26,151,138,244,249,248,250,252,187,52,0,0,10,75,133,
+173,48,69,178,185,118,21,69,82,40,86,30,0,88,148,22,16,38,36,10,55,159,48,22,210,249,197,65,45,0,0,0,22,154,91,0,0,0,3,36,15,24,64,18,0,0,0,83,
+206,251,248,94,13,33,55,82,12,20,115,248,248,100,36,58,36,0,0,0,24,173,185,160,158,250,250,91,0,0,0,0,17,38,40,128,124,12,80,176,169,46,9,54,45,0,0,0,
+0,14,4,0,0,0,3,36,15,24,59,49,217,251,213,21,0,26,151,84,14,37,4,59,190,155,52,0,0,10,75,133,173,48,69,178,185,118,21,69,82,40,86,30,0,88,148,22,
+16,38,36,10,69,234,249,203,31,35,12,54,45,0,0,0,22,207,250,239,58,0,3,36,15,24,64,18,0,0,0,83,179,110,3,0,13,33,55,82,12,20,33,1,0,16,36,58,
+36,0,0,0,24,173,185,160,101,93,65,2,0,0,0,0,36,6,127,142,10,0,10,82,175,200,250,249,90,18,198,248,198,18,0,0,0,3,33,19,0,0,27,59,35,86,102,64,
+2,0,99,250,250,248,251,252,187,52,0,0,0,8,58,83,112,166,176,173,73,20,61,43,77,102,31,0,0,0,88,154,52,1,9,83,161,48,22,207,248,198,79,44,0,0,0,22,
+148,88,0,0,0,3,33,19,0,0,27,64,18,0,0,122,252,253,168,3,0,13,33,54,89,39,0,94,248,248,132,54,0,0,0,5,114,185,189,180,77,100,250,250,92,0,0,19,
+36,6,127,142,10,0,10,82,175,168,71,41,0,0,0,0,0,0,0,0,0,3,33,19,0,0,27,59,51,217,251,212,20,0,26,151,84,10,79,190,155,52,0,0,0,8,58,83,
+112,166,176,173,73,20,61,43,77,102,31,0,0,0,88,154,52,1,9,95,234,249,203,18,0,16,69,44,0,0,0,22,148,88,135,248,239,65,33,19,0,0,27,64,18,0,0,48,
+164,185,117,3,0,13,33,54,89,39,0,0,0,8,64,54,0,0,0,5,114,185,189,180,77,10,68,70,3,0,0,19,8,123,124,9,2,0,0,10,84,175,202,249,248,216,248,198,
+18,0,0,0,3,36,18,0,0,0,0,26,59,36,86,102,63,82,243,249,252,252,251,187,54,0,0,0,10,62,34,12,125,201,183,104,0,7,44,71,82,74,64,3,0,0,19,111,
+148,20,51,160,49,22,207,248,196,64,49,32,6,0,22,148,88,0,0,0,3,36,18,0,0,0,0,26,64,18,90,248,249,206,204,117,3,0,10,44,83,170,74,1,100,250,249,100,
+35,3,6,116,179,162,108,146,157,22,96,250,250,91,17,36,8,123,124,9,2,0,0,10,84,175,172,45,2,0,0,0,0,0,0,0,3,36,18,0,0,0,0,26,59,52,217,251,
+212,20,0,25,142,119,183,154,54,0,0,0,10,62,34,12,125,201,183,104,0,7,44,71,82,74,64,3,0,0,19,111,148,20,66,234,249,203,18,0,8,53,49,32,6,0,22,148,
+88,0,0,135,248,241,77,0,0,0,0,26,64,18,0,0,41,179,204,117,3,0,10,44,83,170,74,1,10,62,34,15,35,3,6,116,179,162,108,146,157,22,3,70,70,2,17,36,
+123,124,6,0,0,0,0,0,37,95,175,205,249,248,216,18,0,0,0,3,36,19,0,0,0,0,0,0,26,59,38,87,151,246,248,248,250,253,205,58,30,6,0,10,62,37,0,74,
+182,199,155,147,56,33,38,90,72,21,66,70,3,0,21,3,81,153,148,44,22,207,248,194,50,45,0,13,38,28,148,88,0,0,0,3,36,19,0,0,0,0,0,0,26,132,248,248,
+94,41,180,204,117,4,21,55,154,195,169,27,58,117,248,248,102,41,119,179,162,107,66,22,128,157,22,96,250,250,104,7,123,124,6,0,0,0,0,0,37,95,175,169,48,3,0,0,
+0,0,0,3,36,19,0,0,0,0,0,0,26,59,53,218,251,212,19,0,79,209,181,58,30,6,0,10,62,37,0,74,182,199,155,147,56,33,38,90,72,21,66,70,3,0,21,3,
+81,160,231,249,203,18,0,0,38,45,0,13,38,28,148,88,0,0,0,3,148,248,239,63,0,0,0,0,26,64,18,0,0,41,180,204,117,4,21,55,154,195,169,27,58,37,0,0,
+19,41,119,179,162,107,66,22,128,157,22,3,69,70,21,7,124,6,0,0,0,0,0,0,1,14,95,237,253,249,248,90,0,0,3,36,19,0,0,0,0,0,0,0,0,26,58,108,
+247,251,250,250,251,190,160,85,13,34,16,60,37,0,74,178,178,82,76,118,173,82,87,28,18,61,22,66,70,3,0,0,50,174,150,37,207,248,194,14,4,0,0,0,35,164,92,0,
+0,0,3,36,19,0,0,0,0,0,0,0,90,249,250,106,0,0,41,180,203,125,57,140,183,152,74,102,43,0,94,248,248,173,189,163,104,70,2,0,22,130,157,22,96,250,250,170,
+124,6,0,0,0,0,0,0,1,14,82,175,170,48,4,0,0,0,3,36,19,0,0,0,0,0,0,0,0,26,58,54,218,251,211,74,186,160,160,85,13,34,16,60,37,0,74,178,
+178,82,76,118,173,82,87,28,18,61,22,66,70,3,0,0,64,237,252,207,18,0,0,0,4,0,0,0,35,164,92,0,0,0,3,36,19,130,248,239,63,0,0,0,0,26,64,18,
+0,0,41,180,203,125,57,140,183,152,74,102,43,0,0,0,7,129,189,163,104,70,2,0,22,130,157,22,3,70,72,124,9,0,0,0,0,0,0,0,0,18,200,250,233,183,249,248,
+90,3,36,19,0,0,0,0,0,0,0,0,0,0,98,246,249,250,251,252,186,52,24,150,87,20,73,38,0,74,178,178,74,0,19,83,122,189,73,0,0,22,61,22,66,70,3,55,
+157,44,96,235,249,194,14,0,0,0,0,22,148,97,38,6,0,3,36,19,0,0,0,0,0,0,0,90,248,248,110,64,19,0,0,40,181,207,170,179,134,34,66,70,78,13,0,99,
+252,253,198,114,69,2,0,0,0,22,130,157,20,97,253,253,96,0,0,0,0,0,0,0,0,0,10,85,159,132,41,6,0,3,36,19,0,0,0,0,0,0,0,0,0,0,25,58,
+55,217,251,241,161,52,24,150,87,20,73,38,0,74,178,178,74,0,19,83,122,189,73,0,0,22,61,22,66,70,3,69,233,249,219,156,22,0,0,0,0,0,0,22,148,97,38,6,
+0,3,36,19,0,0,130,248,239,68,0,0,0,0,26,64,19,0,0,40,181,207,170,179,134,34,66,70,78,13,0,8,121,179,165,114,69,2,0,0,0,22,130,157,20,4,159,160,
+70,3,0,0,0,0,0,0,18,198,248,200,27,122,176,249,248,112,19,0,0,0,0,0,0,0,0,0,0,81,243,249,250,251,252,187,81,0,0,24,154,114,43,32,78,178,178,74,
+0,10,30,46,102,121,161,52,0,0,22,61,22,66,109,160,48,22,207,250,229,31,0,0,0,0,22,148,88,0,14,36,9,34,19,0,0,0,0,0,0,0,90,248,248,94,0,25,
+64,19,0,23,79,193,204,168,28,59,42,30,55,82,21,121,207,252,251,139,32,2,0,0,0,0,22,128,145,121,169,250,250,92,0,0,0,0,0,0,0,0,0,8,9,122,130,41,
+9,34,19,0,0,0,0,0,0,0,0,0,0,0,0,25,53,96,241,252,216,18,0,24,154,114,43,32,78,178,178,74,0,10,30,46,102,121,161,52,0,0,22,61,22,66,120,234,
+249,203,18,88,148,22,0,0,0,0,22,148,88,0,14,36,9,34,19,0,0,0,0,130,248,239,68,0,0,0,0,25,64,19,0,23,79,193,204,168,28,59,42,30,55,82,21,121,
+179,160,101,75,32,2,0,0,0,0,22,128,145,121,120,74,70,70,3,0,0,0,0,18,198,248,198,18,0,5,122,176,250,248,90,0,0,0,0,0,0,0,0,0,81,244,248,248,
+250,252,185,96,102,56,0,9,79,64,0,84,190,180,74,0,10,34,39,83,40,74,119,162,52,0,0,22,61,72,183,102,23,207,248,194,95,148,22,0,0,22,148,88,0,0,0,14,
+58,21,0,0,0,0,0,0,0,90,248,248,94,16,4,0,25,60,35,48,139,179,192,203,145,37,0,12,33,62,166,182,158,159,250,248,101,36,3,0,0,0,0,22,178,185,27,96,
+250,250,92,0,0,0,0,0,0,0,0,0,0,5,122,129,62,21,0,0,0,0,0,0,0,0,0,0,0,16,3,0,74,191,160,219,251,211,18,9,79,64,0,84,190,180,74,0,
+10,34,39,83,40,74,119,162,52,0,0,22,61,85,239,251,203,18,0,0,88,148,22,0,0,22,148,88,0,0,0,14,58,21,0,0,0,0,0,0,126,248,239,68,0,16,4,0,
+25,60,35,48,139,179,192,203,145,37,0,12,33,62,166,182,158,104,70,1,16,59,172,18,0,0,0,22,178,185,27,3,3,70,70,3,0,0,18,198,248,198,18,0,0,0,8,139,
+180,249,248,90,0,0,0,0,0,0,11,92,243,248,249,250,252,187,78,45,91,102,59,55,36,0,74,177,182,101,4,8,34,39,87,30,0,13,78,120,163,51,0,0,71,182,66,75,
+219,248,194,9,0,88,147,18,18,147,88,0,0,0,3,32,28,34,6,0,0,0,0,0,90,248,248,104,0,19,36,3,0,38,90,154,179,127,59,191,207,120,5,0,19,139,195,185,
+99,67,96,248,248,102,36,5,0,0,5,120,125,128,154,22,96,250,250,92,0,0,0,0,0,0,0,0,0,0,8,139,136,38,6,0,0,0,0,0,0,0,11,16,0,18,30,62,
+189,155,78,60,218,251,211,69,36,0,74,177,182,101,4,8,34,39,87,30,0,13,78,120,163,51,0,0,85,239,249,215,76,2,0,0,0,88,147,18,18,147,88,0,0,0,3,32,
+28,34,6,0,0,0,0,0,0,126,248,240,68,19,36,3,0,38,90,154,179,127,59,191,207,120,5,0,19,139,195,185,99,67,2,0,0,177,249,199,18,0,5,120,125,128,154,22,
+19,3,70,70,3,18,198,248,198,18,0,0,0,3,36,24,118,168,249,248,90,0,0,0,0,0,85,245,248,248,250,252,185,49,22,57,46,92,102,72,0,66,165,165,71,12,40,34,
+38,87,30,0,0,0,12,66,116,153,38,41,149,64,79,211,250,210,12,0,0,0,84,135,135,84,0,0,0,3,36,19,0,14,38,6,0,0,0,90,248,248,97,36,19,0,18,32,
+24,46,149,190,135,21,61,65,171,197,111,16,108,162,160,109,102,15,0,94,248,248,102,21,0,6,109,120,4,22,128,146,19,96,250,250,92,0,0,0,0,0,0,0,0,3,36,24,
+118,117,43,6,0,0,0,0,0,0,5,36,18,0,68,184,153,49,22,57,60,218,251,214,18,66,165,165,71,12,40,34,38,87,30,0,0,0,12,66,116,153,38,56,232,249,216,38,
+66,69,3,0,0,0,84,135,135,84,0,0,0,3,36,19,0,14,38,6,0,0,0,0,0,0,129,249,240,72,18,32,24,46,149,190,135,21,61,65,171,197,111,16,108,162,160,109,
+102,15,0,0,0,18,202,248,198,23,109,120,4,22,128,146,152,21,3,70,83,199,248,198,18,0,0,0,3,36,19,0,6,109,172,249,248,90,0,0,0,81,243,248,249,250,252,181,
+68,0,0,22,56,69,96,102,109,165,165,66,0,8,39,57,85,28,0,0,0,0,0,0,50,109,157,151,34,22,211,250,198,73,70,3,0,0,21,150,150,21,0,5,110,71,19,0,
+0,0,14,38,6,0,90,248,248,94,0,3,36,18,0,35,74,142,168,133,69,62,34,0,34,169,195,161,154,135,98,81,54,80,13,0,94,248,248,90,5,118,111,6,0,0,22,121,
+152,21,96,250,250,92,0,0,0,0,0,0,3,36,19,0,6,109,125,42,6,0,0,0,0,0,0,3,29,70,186,148,68,0,0,22,56,82,219,251,222,171,165,66,0,8,39,57,
+85,28,0,0,0,0,0,0,50,109,164,232,249,203,38,59,18,66,70,3,0,0,21,150,150,21,0,5,110,71,19,0,0,0,14,38,6,0,0,0,0,0,0,128,249,240,72,35,
+74,142,168,133,69,62,34,0,34,169,195,161,154,135,98,81,54,80,13,0,0,0,18,198,248,224,121,6,0,0,22,121,128,157,22,21,214,250,199,18,0,0,0,3,36,19,0,0,
+0,5,125,176,249,248,90,0,81,243,248,248,250,252,186,49,14,34,2,7,63,66,48,140,209,193,74,0,10,33,41,88,55,2,0,0,0,0,0,0,0,90,191,164,65,207,248,198,
+64,21,66,70,3,27,147,81,81,144,34,119,142,31,0,0,0,0,0,14,38,94,248,248,94,0,0,0,3,32,35,49,157,189,129,19,63,70,18,0,0,48,191,202,172,97,69,16,
+31,56,83,11,0,94,248,248,169,123,6,0,0,0,0,22,128,157,22,96,250,250,92,0,0,0,0,3,36,19,0,0,0,5,125,130,42,6,0,0,0,0,0,0,61,191,154,49,
+14,34,2,7,63,66,63,229,254,241,87,0,10,33,41,88,55,2,0,0,0,0,0,0,0,102,241,252,213,18,0,18,57,21,66,70,3,27,147,81,81,144,34,119,142,31,0,0,
+0,0,0,14,38,6,0,0,0,0,0,0,124,249,241,107,157,189,129,19,63,70,18,0,0,48,191,202,172,97,69,16,31,56,83,11,0,0,0,23,225,252,199,18,0,0,0,22,
+22,130,164,203,248,214,83,3,0,0,3,36,19,0,0,0,3,69,65,122,175,249,248,141,243,248,248,250,252,187,68,14,0,14,19,60,33,21,115,193,206,146,49,10,32,40,88,23,
+10,38,5,4,9,0,0,0,55,158,83,128,237,249,194,9,21,61,22,66,70,118,91,0,0,85,180,141,20,0,0,0,0,0,0,0,99,249,248,94,0,22,56,6,0,23,76,157,
+179,135,30,60,33,22,64,20,13,124,179,193,202,149,9,0,13,35,59,81,17,0,97,252,252,94,0,0,0,0,0,0,22,130,157,22,96,250,250,92,0,0,3,36,19,0,0,0,
+3,69,65,122,129,42,6,0,0,15,14,59,190,155,68,14,0,14,19,60,33,21,115,198,244,252,209,27,32,40,88,23,10,38,5,4,9,0,0,0,69,233,250,226,168,52,0,0,
+21,61,22,66,70,118,91,0,0,85,180,141,20,0,0,0,0,0,0,0,14,38,6,0,0,22,56,6,0,134,250,248,200,135,30,60,33,22,64,20,13,124,179,193,202,149,9,0,
+13,35,59,81,17,0,5,123,134,199,248,198,18,0,0,0,0,38,227,252,203,21,70,70,2,1,36,19,0,0,0,3,70,71,5,5,122,175,249,248,248,248,251,252,187,52,3,34,
+16,7,61,37,0,74,185,196,111,94,102,65,39,87,29,0,0,13,37,37,9,10,23,55,159,48,22,217,251,233,59,0,0,22,61,22,66,81,3,0,4,115,162,144,20,0,0,0,
+0,0,0,90,248,248,116,3,9,80,102,54,18,55,153,189,135,17,61,37,0,0,24,74,142,179,145,116,183,194,122,6,0,11,34,70,82,27,132,173,248,248,90,0,0,0,0,0,
+0,22,130,157,22,96,250,250,91,1,36,19,0,0,0,3,70,71,5,5,122,129,39,6,0,2,79,191,155,52,3,34,16,7,61,37,0,74,185,196,121,219,251,212,54,87,29,0,
+0,13,37,37,9,10,23,69,234,249,203,65,120,163,52,0,0,22,61,22,66,81,3,0,4,115,162,144,20,0,0,0,0,0,0,0,0,14,35,3,9,80,102,54,18,55,202,253,
+249,85,61,37,0,0,24,74,142,179,145,116,183,194,122,6,0,11,34,70,82,27,132,124,6,18,198,248,198,18,0,0,18,198,248,227,164,22,3,69,68,33,17,0,0,0,3,70,
+70,3,0,0,5,165,250,249,248,250,252,187,60,0,0,1,36,65,36,0,74,178,178,90,56,56,96,100,93,26,0,0,0,4,44,40,13,37,64,159,48,22,207,248,206,123,163,52,
+0,0,22,61,22,66,70,7,123,141,26,85,148,22,0,0,0,0,90,248,248,94,10,40,79,102,77,54,65,153,179,127,45,65,36,0,0,0,15,144,197,157,92,76,39,170,204,124,
+6,4,42,37,61,173,135,6,94,248,248,90,0,0,0,0,0,0,22,130,157,22,96,250,250,112,17,0,0,0,3,70,70,3,0,0,5,122,129,42,4,60,190,155,60,0,0,1,
+36,65,36,0,74,178,178,90,56,70,220,251,219,42,0,0,0,4,44,40,13,37,77,234,249,203,18,0,51,119,163,52,0,0,22,61,22,66,70,7,123,141,26,85,148,22,0,0,
+0,0,0,0,0,0,10,40,79,102,77,54,65,153,179,187,249,246,98,0,0,0,15,144,197,157,92,76,39,170,204,124,6,4,42,37,61,173,135,6,0,0,18,198,248,198,18,0,
+198,248,198,38,130,157,22,4,86,76,1,0,0,3,70,71,4,0,0,0,81,243,252,252,251,253,210,52,28,18,0,10,60,37,0,79,178,178,74,0,28,64,73,102,101,43,0,0,
+6,38,11,19,61,65,159,48,22,207,248,194,9,51,119,163,52,0,0,22,61,22,69,159,141,23,0,0,88,148,22,0,1,90,248,248,94,0,8,82,102,78,31,53,167,185,124,19,
+60,37,0,0,0,15,134,179,156,112,80,4,0,35,178,204,128,39,12,23,151,154,85,13,0,94,248,248,90,0,4,0,0,0,0,22,130,157,22,96,250,250,90,0,0,3,70,71,
+4,0,0,0,0,5,122,122,88,188,155,52,28,18,0,10,60,37,0,79,178,178,74,0,28,64,86,221,251,208,18,0,6,38,11,19,61,78,234,249,203,18,0,0,0,51,119,163,
+52,0,0,22,61,22,69,159,141,23,0,0,88,148,22,0,1,0,0,0,0,0,8,82,102,78,31,53,167,185,124,19,154,249,243,72,0,15,134,179,156,112,80,4,0,35,178,204,
+128,39,12,23,151,154,85,13,0,0,0,18,198,248,199,18,248,198,18,0,22,129,158,48,19,67,70,1,1,70,70,4,44,22,0,81,243,248,248,252,253,252,250,90,2,32,24,58,
+37,0,79,202,187,74,0,10,29,52,100,70,94,102,44,1,34,14,0,24,72,172,53,22,207,248,194,9,0,0,62,118,161,52,0,0,22,64,136,166,80,2,0,0,0,88,148,24,
+120,249,248,94,0,10,79,102,80,51,56,154,180,139,34,58,37,0,0,0,15,135,179,148,91,80,60,19,0,0,34,177,208,129,20,132,135,36,55,82,13,0,94,248,248,90,30,19,
+0,0,0,0,22,129,158,48,106,250,250,91,1,70,70,4,44,22,0,0,0,0,1,142,209,153,54,0,2,32,24,58,37,0,79,202,187,74,0,10,29,52,100,83,219,251,208,19,
+34,14,0,24,85,237,249,203,18,0,0,0,0,0,62,118,161,52,0,0,22,64,136,166,80,2,0,0,0,88,148,24,46,22,0,0,0,10,79,102,80,51,56,154,180,139,34,58,
+37,118,248,243,83,135,179,148,91,80,60,19,0,0,34,177,208,129,20,132,135,36,55,82,13,0,0,0,18,198,249,225,241,35,0,0,0,22,137,162,22,3,68,65,65,69,3,0,
+24,64,94,243,248,248,250,251,211,185,249,248,90,11,72,44,0,74,178,188,138,28,6,33,40,84,46,54,58,99,102,46,3,0,0,57,159,60,58,208,248,194,9,0,0,0,1,58,
+114,162,53,0,5,135,161,37,64,62,1,0,0,0,88,186,249,250,107,0,10,79,102,76,31,63,169,181,121,19,72,44,0,0,0,17,136,179,146,94,76,4,20,64,23,0,0,34,
+177,203,166,116,3,14,34,55,82,13,0,94,248,248,92,36,19,0,0,0,0,22,137,162,22,96,250,250,132,69,3,0,24,64,20,0,0,0,59,184,190,144,34,6,0,11,72,44,
+0,74,178,188,138,28,6,33,40,84,46,54,72,220,251,208,21,0,0,71,234,249,211,24,0,0,0,0,0,0,1,58,114,162,53,0,5,135,161,37,64,62,1,0,0,0,88,148,
+44,64,20,0,10,79,102,76,31,63,169,181,121,19,72,44,0,0,118,249,249,202,146,94,76,4,20,64,23,0,0,34,177,203,166,116,3,14,34,55,82,13,0,0,0,102,248,249,
+249,202,18,0,3,30,34,127,157,22,5,98,98,5,0,0,0,97,246,248,248,250,252,185,58,121,175,249,248,128,36,30,87,178,178,74,28,89,52,38,96,111,22,22,49,42,100,101,
+42,2,57,159,48,22,210,249,196,9,0,0,0,0,0,0,62,120,158,53,115,140,39,58,26,21,0,0,0,0,90,250,252,121,60,28,77,102,78,33,58,157,183,139,24,59,36,30,
+18,0,25,138,179,144,93,75,5,0,0,23,55,5,0,0,39,194,204,124,5,0,14,33,55,82,13,0,94,248,248,48,36,19,0,0,3,30,34,127,157,22,97,251,251,93,0,0,
+0,23,64,18,0,60,193,230,152,121,129,39,16,59,36,30,87,178,178,74,28,89,52,38,96,111,22,22,49,58,220,251,207,20,71,234,249,203,31,38,6,0,0,0,0,0,0,0,
+62,120,158,53,115,140,39,58,26,21,0,0,0,0,0,88,148,43,60,28,77,102,78,33,58,157,183,139,24,59,36,30,18,0,25,192,253,249,142,75,5,0,0,23,55,5,0,0,
+39,194,204,124,5,0,14,33,55,82,13,0,90,248,248,217,199,249,202,19,36,19,0,22,128,158,81,66,65,68,3,0,81,243,249,250,250,252,187,50,0,5,122,178,250,249,90,76,
+189,184,74,0,6,52,91,90,109,179,139,18,4,0,39,102,96,67,159,48,22,207,248,197,46,6,0,0,0,0,0,0,0,65,120,184,150,19,0,22,63,18,0,0,0,90,248,248,
+150,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2,36,19,93,179,144,93,74,4,0,0,0,0,4,0,0,5,115,125,171,204,126,7,0,13,33,55,82,13,0,94,126,0,
+3,36,18,1,36,19,0,22,128,158,81,136,250,250,92,0,0,0,24,56,71,194,231,249,248,125,122,133,77,38,0,76,189,184,74,0,6,52,91,90,109,179,139,18,4,0,54,221,
+251,216,235,249,203,18,0,14,38,6,0,0,0,0,0,0,0,65,120,184,150,19,0,22,63,18,0,0,0,0,0,0,88,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2,
+36,19,93,179,195,251,247,80,0,0,0,0,4,0,0,5,115,125,171,204,126,7,0,13,33,55,82,98,248,248,94,18,18,198,249,208,32,0,0,0,22,152,180,22,1,70,70,83,
+243,248,248,250,252,186,40,0,0,0,15,153,185,249,250,205,179,100,16,8,33,38,89,91,49,139,179,138,18,0,0,40,83,159,48,22,207,248,194,9,14,38,6,0,0,0,0,0,
+0,5,149,179,153,50,0,0,22,64,22,0,90,248,248,94,0,94,180,115,97,25,36,159,179,118,16,59,43,32,6,0,3,36,28,97,96,74,4,0,0,0,0,0,0,0,5,123,
+124,1,31,176,204,127,7,0,13,33,55,82,13,0,0,0,0,2,34,45,15,0,0,0,22,152,180,22,95,250,250,92,0,0,0,74,194,231,249,248,248,248,103,153,143,37,75,178,
+179,100,16,8,33,38,89,91,49,139,179,138,18,0,0,56,220,252,249,206,18,0,0,0,14,38,6,0,0,0,0,0,0,5,149,179,153,50,0,0,22,64,22,0,0,0,0,0,
+0,94,180,115,97,25,36,159,179,118,16,59,43,32,6,0,3,36,28,97,96,155,248,243,77,0,0,0,0,0,5,123,124,1,31,176,204,127,7,0,13,33,126,250,248,94,0,0,
+0,20,206,249,201,18,0,3,66,76,126,156,22,3,129,246,248,248,250,252,186,78,12,0,0,10,62,40,112,186,253,253,138,2,38,42,39,87,26,25,90,47,138,179,138,18,0,57,
+159,48,22,207,248,194,9,8,0,14,38,6,0,0,0,0,5,124,139,71,115,162,52,0,0,22,64,104,248,248,94,0,10,79,155,180,50,84,165,179,117,16,62,37,0,14,38,6,
+0,1,34,82,71,4,0,0,0,0,0,0,0,5,123,124,6,0,0,32,176,204,128,11,0,13,33,55,82,13,0,0,0,2,34,45,15,0,0,3,66,76,126,156,22,96,250,250,
+92,0,60,194,231,250,248,248,248,192,69,40,112,146,183,179,74,2,38,42,39,87,26,25,90,47,138,179,138,18,0,71,235,249,248,202,18,0,0,8,0,14,38,6,0,0,0,0,
+5,124,139,71,115,162,52,0,0,22,64,22,0,0,0,0,10,79,155,180,50,84,165,179,117,16,62,37,0,14,38,6,0,1,34,82,71,4,113,248,243,81,0,0,0,5,123,124,
+6,0,0,32,176,204,128,11,0,98,249,250,146,13,0,0,3,36,34,198,249,202,19,70,70,2,20,130,158,96,243,250,250,250,252,187,40,24,59,13,8,62,37,0,74,179,210,251,
+248,95,32,56,92,26,0,0,28,90,47,138,179,133,69,152,48,22,207,248,194,9,0,29,24,0,14,38,6,0,0,5,125,142,23,0,66,120,162,55,1,0,104,250,249,94,0,10,
+79,102,79,88,143,166,197,123,14,62,37,0,0,0,14,38,4,6,78,87,18,0,0,5,0,0,0,0,2,118,123,6,0,0,0,0,32,176,204,143,26,0,13,33,55,82,13,0,
+3,36,18,1,36,16,1,70,70,2,20,130,158,22,96,250,250,131,196,233,249,249,250,248,187,69,37,0,74,179,183,101,4,8,32,56,92,26,0,0,28,90,47,138,179,133,82,232,
+249,206,202,248,198,18,0,29,24,0,14,38,6,0,0,5,125,142,23,0,66,120,162,55,1,0,22,64,23,0,0,10,79,102,79,88,143,166,197,123,14,62,37,0,0,0,14,38,
+4,6,78,87,18,0,0,113,248,243,81,0,2,118,123,6,0,0,0,0,32,176,204,143,107,248,248,115,55,82,13,0,31,19,0,18,198,249,215,81,3,0,0,23,165,250,249,248,
+251,252,187,42,0,0,25,59,60,34,0,74,177,171,140,169,249,249,115,84,52,13,0,0,0,28,90,48,132,179,179,60,22,207,248,194,9,0,0,1,33,24,0,14,38,6,5,123,
+142,24,0,0,0,66,121,145,15,90,248,249,128,1,10,79,102,79,10,36,171,179,132,59,60,34,0,0,0,0,0,12,36,79,70,8,33,19,122,194,9,0,0,4,109,111,5,0,
+0,0,0,0,0,32,176,204,144,26,0,13,33,55,81,17,31,19,0,0,2,33,75,68,3,0,0,23,124,150,23,94,251,253,239,249,248,248,249,201,67,34,0,74,177,171,140,119,
+43,33,38,84,52,13,0,0,0,28,90,48,132,184,238,249,203,18,18,198,248,198,18,1,33,24,0,14,38,6,5,123,142,24,0,0,0,66,121,145,15,0,0,23,55,1,10,79,
+102,79,10,36,171,179,132,59,60,34,0,0,0,0,0,12,36,79,70,8,33,19,0,0,108,248,243,84,109,111,5,0,0,0,0,0,0,32,176,222,252,248,94,13,33,55,81,17,
+27,0,0,0,20,213,250,202,18,0,0,81,243,250,252,250,251,186,42,0,0,0,7,65,70,12,74,178,178,71,6,125,184,250,250,107,0,36,19,0,0,0,27,90,96,179,179,143,
+211,248,194,9,0,0,0,0,1,33,24,0,14,41,126,139,20,0,0,0,0,0,66,94,98,248,248,94,2,10,79,102,79,10,39,161,179,142,138,80,70,12,0,0,0,0,0,7,
+83,88,7,0,3,141,248,248,194,9,5,121,119,2,0,0,0,0,0,0,0,0,32,174,204,145,26,0,13,32,55,95,27,0,0,0,2,69,86,18,0,0,0,0,4,88,141,80,
+214,252,249,248,248,248,182,72,70,12,74,178,178,71,6,125,142,61,86,26,0,36,19,0,0,0,27,90,108,238,253,230,34,0,0,18,198,248,198,18,1,33,24,0,14,41,126,139,
+20,0,0,0,0,0,66,94,13,0,0,0,2,10,79,102,79,10,39,161,179,142,138,80,70,12,0,0,0,0,0,7,83,88,7,0,3,36,19,0,0,108,248,249,162,2,0,0,
+0,0,0,0,0,0,110,252,254,186,26,0,13,32,55,95,79,13,0,3,70,83,200,249,202,18,81,243,248,248,252,253,190,42,0,0,0,10,58,33,28,118,182,178,74,0,10,37,
+142,201,250,248,90,3,36,19,0,0,0,74,189,87,144,241,252,198,9,0,0,0,0,0,0,1,33,24,11,129,152,25,0,0,0,0,0,0,0,133,250,248,94,0,9,79,102,78,
+10,41,162,179,111,16,124,162,48,62,13,0,0,0,9,81,64,16,36,6,99,248,249,248,248,195,128,124,5,0,8,51,11,0,0,0,0,0,0,30,174,204,146,26,0,13,52,62,
+79,13,0,3,70,70,8,33,19,0,0,0,0,0,121,212,236,249,248,248,248,183,65,33,28,118,182,178,74,0,10,37,142,169,57,2,0,3,36,19,0,0,0,86,240,250,230,184,
+138,18,0,0,18,198,248,198,18,1,33,24,11,129,152,25,0,0,0,0,0,0,0,66,84,10,0,0,9,79,102,78,10,41,162,179,111,16,124,162,48,62,13,0,0,0,9,81,
+64,16,36,6,0,3,36,19,0,5,179,252,243,86,8,51,11,0,0,0,0,90,248,249,204,204,146,26,0,13,52,62,55,80,19,66,71,3,18,199,249,217,243,248,248,250,251,203,
+155,22,0,0,10,62,35,0,74,188,197,82,0,10,33,40,91,136,174,249,248,90,3,36,19,0,52,159,74,105,217,252,237,142,18,0,0,0,0,0,0,0,1,32,96,139,32,33,
+3,0,0,0,0,0,90,248,250,147,8,8,79,102,77,14,41,168,179,110,14,62,35,88,148,51,63,12,0,9,82,70,0,0,14,38,15,194,248,249,248,252,223,20,0,0,53,102,
+77,9,0,0,0,0,0,0,30,174,204,145,29,29,27,30,55,80,19,66,71,3,0,3,36,19,0,0,0,60,187,241,252,249,248,248,248,134,35,0,74,188,197,82,0,10,33,40,
+91,136,127,42,7,0,3,36,19,0,66,234,250,221,64,138,179,138,18,0,0,18,198,248,198,18,1,32,96,139,32,33,3,0,0,0,0,0,0,0,66,84,8,8,79,102,77,14,
+41,168,179,110,14,62,35,88,148,51,63,12,0,9,82,70,0,0,14,38,7,0,3,36,23,123,124,112,248,243,121,102,77,9,0,0,90,248,248,94,30,174,204,145,29,29,27,30,
+32,54,102,70,1,0,0,18,214,249,248,248,250,252,187,56,87,148,22,10,62,37,0,74,178,178,97,60,20,30,39,88,28,5,122,176,249,248,90,3,36,67,159,53,22,212,250,206,
+142,179,139,58,14,0,0,0,0,0,0,1,64,40,0,12,35,6,0,0,0,90,248,248,94,64,78,78,102,76,27,28,32,156,114,13,62,37,0,0,88,148,52,59,20,79,71,3,
+0,0,0,14,38,15,190,248,252,252,248,194,14,0,14,80,102,75,13,40,14,0,0,0,0,33,173,203,155,42,0,14,32,54,102,70,1,0,0,0,3,36,18,0,60,196,236,250,
+250,252,249,205,250,249,90,74,178,178,97,60,20,30,39,88,28,5,122,129,43,6,0,3,36,80,234,249,203,42,90,49,138,179,139,58,14,0,18,198,248,198,18,1,64,40,0,12,
+35,6,0,0,0,0,0,0,0,64,78,78,102,76,27,28,32,156,114,13,62,37,0,0,88,148,52,59,20,79,71,3,0,0,0,14,38,6,0,8,142,134,6,0,108,248,244,139,
+102,75,13,116,248,248,94,0,0,29,173,203,155,42,0,14,14,82,86,76,12,0,0,81,243,248,249,250,252,187,57,0,0,88,152,79,37,0,74,178,179,74,0,37,68,46,85,28,
+0,0,5,122,176,249,248,90,54,173,68,22,207,248,200,97,48,138,194,161,23,0,0,0,0,0,2,34,20,29,24,0,14,38,6,0,90,248,248,94,0,11,97,102,76,26,32,4,
+0,19,15,62,37,0,0,2,3,88,148,54,99,72,1,0,0,0,0,0,14,38,20,222,252,249,248,248,194,14,0,11,79,102,90,50,4,0,0,0,86,217,53,180,205,146,28,0,
+14,82,86,76,12,0,0,0,0,3,32,71,195,236,250,248,248,250,223,83,117,248,250,205,179,74,0,37,68,46,85,28,0,0,5,122,130,42,6,0,68,237,249,203,18,0,26,91,
+48,138,194,161,23,0,0,18,198,248,198,50,20,29,24,0,14,38,6,0,0,0,0,0,0,11,97,102,76,26,32,4,0,19,15,62,37,0,0,2,3,88,148,54,99,72,1,0,
+0,0,0,0,14,38,11,123,126,41,19,0,0,104,248,243,138,102,148,249,248,94,0,0,0,0,29,180,205,146,28,0,64,73,34,54,82,13,81,243,248,248,250,253,239,69,0,0,
+0,10,129,163,23,69,178,179,99,8,8,29,58,102,36,0,0,0,0,5,122,176,249,249,193,55,54,210,248,194,9,25,84,79,158,180,138,18,0,0,0,2,35,21,0,1,33,23,
+0,14,38,94,248,248,94,0,10,78,102,93,82,36,1,0,0,10,62,37,0,0,0,4,36,7,93,180,96,56,10,0,0,0,0,0,0,19,143,132,191,248,249,248,248,194,14,0,
+13,95,102,73,6,0,0,86,243,248,225,66,172,204,147,29,64,73,34,54,82,13,0,0,0,0,50,198,236,250,248,248,248,174,132,163,23,138,253,253,154,8,8,29,58,102,36,0,
+0,0,0,5,122,130,39,68,234,249,210,32,0,0,0,25,84,79,158,180,138,18,0,0,18,198,249,203,18,1,33,23,0,14,38,6,0,0,0,0,10,78,102,93,82,36,1,0,
+0,10,62,37,0,0,0,4,36,7,93,180,96,56,10,0,0,0,0,0,0,19,143,127,6,3,36,15,0,0,104,248,244,186,251,250,98,0,0,0,0,2,34,43,172,204,147,29,
+83,0,11,33,55,137,244,248,248,249,250,236,250,201,18,0,10,62,37,81,156,173,175,74,9,41,36,38,82,54,51,4,0,0,0,0,5,113,182,252,249,104,207,248,194,9,0,0,
+61,102,50,138,179,138,18,0,2,35,20,0,0,0,0,30,20,0,99,249,248,94,0,10,79,102,75,28,78,82,9,0,10,62,37,0,0,0,0,0,8,37,81,133,150,54,58,4,
+0,0,0,0,5,123,131,43,15,190,248,248,248,248,194,16,46,52,80,102,74,7,90,243,248,249,248,217,33,172,203,168,83,0,11,33,55,82,13,0,0,22,162,233,250,248,248,248,
+174,66,37,81,156,173,204,250,248,116,36,38,82,54,51,4,0,0,0,0,5,113,147,234,249,203,20,7,0,0,0,0,61,102,50,138,179,138,18,0,2,51,202,248,198,18,0,30,
+20,0,14,38,6,0,0,10,79,102,75,28,78,82,9,0,10,62,37,0,0,0,0,0,8,37,81,133,150,54,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,0,0,106,
+249,250,250,158,74,7,0,0,2,35,20,0,29,172,203,168,149,27,0,13,104,245,250,248,249,250,149,48,199,249,202,26,62,37,0,69,179,179,86,0,8,36,58,88,26,0,16,2,
+0,0,0,0,0,53,179,183,249,248,248,194,9,0,2,50,44,27,88,50,138,179,138,20,36,20,0,0,0,0,0,0,32,105,248,248,118,3,9,79,102,76,27,30,6,66,80,21,
+58,37,0,0,0,0,0,0,8,81,88,11,88,148,36,2,0,0,0,5,123,124,6,15,38,15,185,248,248,248,248,206,64,0,11,83,102,137,243,248,249,248,243,81,0,27,186,209,
+149,27,0,13,33,55,82,13,22,160,229,249,248,249,248,170,66,37,0,69,179,179,86,94,248,249,127,88,26,0,16,2,0,0,0,0,0,67,238,252,211,24,0,0,0,0,2,50,
+44,27,88,50,138,179,138,20,36,20,18,198,248,198,18,0,32,24,0,14,38,3,9,79,102,76,27,30,6,66,80,21,58,37,0,0,0,0,0,0,8,81,88,11,88,148,36,2,
+0,0,0,5,123,124,6,15,38,6,0,0,0,0,2,122,249,248,245,144,102,72,5,0,36,20,0,0,0,27,186,209,203,148,29,81,244,249,250,251,250,148,36,3,18,198,249,212,
+52,0,74,178,173,123,135,31,33,38,88,54,7,0,0,0,0,0,0,0,52,155,55,124,239,249,248,96,0,2,50,50,2,0,25,90,51,138,180,154,36,0,0,0,0,0,0,0,
+90,249,249,94,11,40,79,102,76,27,32,4,0,0,66,102,41,0,0,0,0,0,0,9,82,69,13,36,10,88,148,22,0,0,5,123,124,6,0,0,15,38,15,185,248,248,249,249,
+194,18,0,13,144,251,250,249,248,243,77,0,3,68,83,171,203,148,29,0,13,33,55,97,164,232,249,248,248,248,175,69,36,0,74,178,173,123,135,31,115,249,250,125,7,0,0,0,
+0,0,0,0,66,232,249,226,139,42,6,0,0,2,50,50,2,0,25,90,51,138,180,154,36,0,0,18,198,248,198,18,0,33,24,0,11,40,79,102,76,27,32,4,0,0,66,102,
+41,0,0,0,0,0,0,9,82,69,13,36,10,88,148,22,0,0,5,123,124,6,0,0,15,38,6,0,0,2,122,249,248,156,248,244,144,102,72,34,17,0,0,0,3,68,83,171,
+171,204,183,245,248,248,250,251,180,41,0,0,0,26,212,249,198,87,178,178,72,0,93,162,58,88,27,6,39,11,0,0,0,0,0,52,159,53,22,208,252,235,249,248,91,50,50,2,
+0,0,0,24,89,52,151,185,138,18,0,0,0,6,13,90,248,248,115,20,8,82,102,77,26,32,3,0,0,9,55,73,76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148,
+20,1,123,124,6,0,0,0,0,15,38,13,185,249,249,248,248,194,18,94,248,250,251,250,243,77,0,3,69,76,13,27,171,204,149,29,0,13,52,180,238,249,248,248,248,165,64,37,
+0,74,178,178,72,0,93,162,58,149,249,248,115,11,0,0,0,0,0,66,234,249,203,23,122,130,42,4,1,50,50,2,0,0,0,24,89,52,151,185,138,18,0,0,18,199,248,198,
+18,1,33,20,8,82,102,77,26,32,3,0,0,9,55,73,76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148,20,1,123,124,6,0,0,0,0,15,38,4,1,122,249,248,
+94,0,99,248,244,144,102,77,3,0,0,3,69,76,13,27,27,197,252,252,248,249,250,160,70,80,12,0,11,62,52,198,250,238,184,74,0,10,30,114,185,48,0,0,10,39,11,0,
+0,0,52,159,53,22,207,248,195,127,175,249,249,122,2,0,0,0,0,0,25,101,62,138,179,138,18,0,0,14,130,248,248,94,0,36,84,102,79,48,32,2,0,0,10,62,36,0,
+56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86,135,121,118,6,0,0,0,0,0,0,14,33,56,198,248,248,248,248,215,248,248,249,250,248,122,3,1,70,68,15,59,20,
+27,170,204,149,26,20,164,237,250,250,248,248,162,66,37,0,74,178,178,74,0,10,30,114,185,48,94,248,248,115,11,0,0,0,66,234,249,203,18,0,5,122,129,37,48,49,2,0,
+0,0,0,0,25,101,62,138,179,138,18,0,0,31,212,248,198,18,0,36,84,102,79,48,32,2,0,0,10,62,36,0,56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86,
+135,121,118,6,0,0,0,0,0,0,14,33,121,249,248,94,0,0,0,99,248,249,147,102,70,3,1,70,68,15,59,20,94,244,252,254,252,249,145,40,32,54,81,20,56,37,0,87,
+238,253,214,18,10,33,39,88,107,148,22,0,0,9,39,11,0,52,159,53,22,207,248,194,9,5,122,189,250,248,90,0,0,0,0,3,30,39,86,52,138,179,138,18,0,90,249,250,
+105,0,10,78,102,81,25,38,36,5,0,7,60,37,0,0,0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11,152,179,27,0,0,0,0,0,0,0,0,54,65,15,180,248,
+248,248,248,248,249,248,240,134,102,68,96,150,9,0,23,64,19,26,170,204,152,157,233,249,249,250,250,166,60,37,0,74,178,178,74,0,10,33,39,88,107,148,22,94,248,248,115,11,
+0,66,234,249,203,18,0,0,0,5,122,150,69,6,0,0,0,0,0,3,30,39,86,52,138,179,138,18,0,0,39,212,248,198,27,78,102,81,25,38,36,5,0,7,60,37,0,0,
+0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11,152,179,27,0,0,0,0,0,0,0,0,125,250,248,94,0,0,0,0,3,121,248,248,146,102,68,96,150,9,0,23,64,
+246,248,249,252,252,200,50,0,12,33,54,87,33,0,74,178,184,214,248,200,49,39,88,28,0,88,148,22,0,0,9,39,61,159,53,22,207,248,194,9,0,2,54,147,176,249,248,90,
+0,0,3,36,19,0,24,90,52,138,179,138,101,248,248,106,56,27,77,102,75,45,45,0,13,38,6,4,22,0,0,0,0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141,
+119,85,145,22,0,0,0,0,0,2,50,48,16,36,14,180,248,248,248,249,248,241,75,14,83,102,102,128,122,5,0,23,64,18,21,168,210,244,249,248,248,249,178,87,33,0,74,178,
+178,74,0,10,33,39,88,28,0,88,148,22,94,248,248,115,74,234,249,203,18,0,0,0,0,2,54,147,130,40,5,0,0,0,3,36,19,0,24,90,52,138,179,138,18,0,0,36,
+210,249,215,113,75,45,45,0,13,38,6,4,22,0,0,0,0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141,119,85,145,22,0,0,0,0,0,2,122,249,248,117,5,0,
+0,0,3,36,19,102,248,248,144,102,102,128,122,5,0,97,249,250,249,249,206,207,150,30,0,13,33,54,80,83,178,178,74,18,200,249,207,100,28,0,0,0,88,148,22,0,0,59,
+174,62,22,207,248,194,9,0,2,50,50,7,122,176,249,248,90,3,36,19,0,0,0,23,89,52,138,206,252,249,94,0,30,97,102,74,27,29,31,23,0,14,38,6,0,0,0,0,
+0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129,42,11,88,148,22,0,0,0,2,50,50,2,0,16,38,112,248,248,249,248,248,225,133,5,70,100,102,69,124,122,5,0,
+24,64,34,157,246,254,252,248,248,159,33,54,80,83,178,178,74,0,10,33,39,88,28,0,0,0,88,148,22,94,248,249,243,249,203,18,0,0,0,0,2,50,50,7,122,130,43,5,
+0,3,36,19,0,0,0,23,89,52,138,179,138,18,0,0,45,220,251,214,43,29,31,23,0,14,38,6,0,0,0,0,0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129,
+42,11,88,148,22,0,0,0,2,122,249,248,94,16,38,5,0,3,36,19,0,80,172,248,250,127,102,69,124,122,85,243,248,249,251,151,49,170,204,151,31,0,13,33,113,203,182,74,
+0,10,49,207,250,204,18,0,0,0,0,88,148,19,48,159,60,58,209,248,194,9,0,2,50,50,2,0,5,123,176,249,248,112,19,0,0,0,0,0,23,90,124,252,253,181,18,8,
+73,102,94,38,28,2,0,33,24,0,14,38,6,0,0,0,0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6,9,39,11,88,148,22,0,2,50,50,2,0,0,0,113,249,
+248,249,248,248,248,248,225,166,70,23,88,102,70,124,122,6,0,45,185,235,249,252,254,252,166,0,13,33,113,203,182,74,0,10,33,39,88,28,0,0,0,0,0,88,148,19,133,252,
+249,225,28,0,0,0,0,2,50,50,2,0,5,123,131,43,8,34,19,0,0,0,0,0,23,90,53,138,179,138,18,8,73,113,219,249,204,20,0,33,24,0,14,38,6,0,0,0,
+0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6,9,39,11,88,148,22,0,2,122,249,248,94,0,0,15,36,8,34,19,0,0,11,124,194,162,23,88,102,70,166,249,248,
+249,250,157,75,17,25,169,204,153,30,0,83,188,194,132,12,7,33,39,100,204,248,198,18,0,0,0,0,81,152,149,48,22,209,249,197,9,0,2,50,50,2,0,0,0,7,81,111,
+250,248,90,0,0,0,0,0,0,104,250,250,181,179,142,87,96,74,42,71,18,0,0,1,33,24,0,14,38,6,0,0,9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0,
+0,9,39,12,88,148,24,50,50,2,0,0,0,108,248,248,250,248,246,248,248,248,250,233,134,5,18,89,102,69,124,116,34,162,236,250,248,249,252,233,153,30,0,83,188,194,132,12,
+7,33,39,88,28,0,0,0,0,0,0,0,81,159,231,249,248,248,115,12,0,0,2,50,50,2,0,0,0,7,81,26,58,20,0,0,0,0,0,0,0,22,89,53,138,179,142,87,
+96,74,58,214,248,198,18,1,33,24,0,14,38,6,0,0,9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0,0,9,39,12,88,148,24,122,249,248,94,0,0,0,0,15,
+58,20,0,0,0,3,74,159,124,5,18,89,151,246,252,252,251,147,31,27,62,16,25,169,204,147,93,178,182,98,54,83,40,38,88,28,18,198,248,198,18,0,0,0,46,178,179,45,
+207,248,196,47,10,1,50,50,2,0,0,0,0,0,3,32,113,249,248,90,0,0,0,0,90,248,249,150,51,142,203,182,84,27,27,28,62,16,0,0,1,33,24,0,14,38,4,8,
+82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0,0,0,9,39,10,88,169,68,2,0,0,0,108,248,248,249,249,241,74,176,248,250,250,248,228,132,5,18,90,102,65,122,
+191,234,249,249,250,248,155,169,204,147,93,178,182,98,54,83,40,38,88,28,0,0,1,0,0,0,0,0,61,238,253,209,105,248,248,115,10,1,50,50,2,0,0,0,0,0,3,32,
+30,34,5,0,0,0,0,0,0,0,22,90,51,142,203,182,84,27,27,44,212,248,198,18,1,33,24,0,14,38,4,8,82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0,
+0,0,9,39,10,88,200,250,248,94,0,0,0,0,3,32,30,34,5,0,3,70,71,8,122,122,5,93,247,251,250,252,186,131,7,0,27,64,15,23,162,204,192,176,70,11,37,68,
+86,83,26,0,6,49,199,248,198,18,0,52,162,117,128,235,249,194,9,8,34,52,48,2,0,0,0,0,0,3,36,19,0,104,249,248,90,0,0,90,248,248,94,20,82,98,185,201,
+150,48,3,0,27,64,16,0,0,1,33,24,0,12,37,80,70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0,0,0,0,8,34,52,120,149,22,0,0,113,248,248,249,248,
+239,70,35,18,197,250,248,248,248,228,132,5,20,91,114,179,244,251,248,248,249,172,15,23,162,204,192,176,70,11,37,68,86,83,26,0,6,33,4,0,0,0,0,66,234,251,226,157,
+22,94,248,248,112,52,48,2,0,0,0,0,0,3,36,19,0,16,38,5,0,0,0,0,0,0,0,20,82,98,185,201,150,48,3,0,43,212,248,198,18,1,33,24,0,12,37,80,
+70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0,0,0,0,8,34,123,251,252,108,0,0,0,0,3,36,19,0,16,35,10,68,71,3,0,5,122,165,243,248,250,251,251,
+83,123,122,5,0,28,64,17,88,194,204,166,25,7,38,56,96,85,8,3,38,15,18,198,248,198,66,164,120,68,207,250,229,31,0,1,50,65,12,0,0,0,0,0,3,36,19,0,
+0,0,104,249,248,90,90,248,248,94,0,7,81,102,97,148,188,139,18,0,0,28,64,18,0,0,1,33,20,6,83,88,7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0,
+0,0,0,1,50,65,12,88,148,22,118,248,248,249,248,239,58,0,15,87,77,177,248,248,248,248,228,132,1,39,197,245,250,252,252,248,140,28,64,17,88,194,204,166,25,7,38,56,
+96,85,8,3,38,15,0,0,0,0,66,235,251,213,18,88,148,22,94,248,249,132,12,0,0,0,0,0,3,36,19,0,0,0,16,38,5,0,0,0,0,0,0,7,81,102,97,148,
+188,139,18,0,0,44,212,248,198,18,1,33,20,6,83,88,7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0,0,0,0,1,122,250,248,150,148,22,0,0,3,36,19,0,
+0,0,15,87,70,2,0,0,0,85,249,252,248,249,252,185,102,65,125,122,11,0,30,97,175,172,175,203,155,51,38,88,51,52,81,42,11,0,0,18,198,249,235,130,68,207,248,194,
+95,148,24,50,48,11,37,12,0,0,0,3,36,19,0,0,0,0,0,104,249,248,248,248,94,0,10,79,102,79,85,71,138,179,138,18,0,0,30,32,0,0,0,0,33,86,66,16,
+36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0,0,0,2,50,48,11,37,12,88,197,249,248,249,248,239,54,0,3,67,75,35,13,176,248,248,248,248,227,130,157,240,251,
+251,250,252,195,11,0,30,97,175,172,175,203,155,51,38,88,51,52,81,42,11,0,0,0,0,66,235,251,213,18,0,0,88,148,24,126,249,248,114,12,0,0,0,3,36,19,0,0,
+0,0,0,16,38,5,0,0,0,0,10,79,102,79,85,71,138,179,138,18,0,0,46,205,248,198,18,0,33,86,66,16,36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0,
+0,0,2,122,249,248,117,12,88,148,22,3,36,19,0,0,0,3,67,75,35,4,0,0,81,243,248,252,252,249,155,98,93,102,35,124,79,0,74,178,178,69,24,168,206,164,100,25,
+8,34,71,85,11,0,0,0,66,235,251,213,210,248,194,9,0,90,169,68,2,0,8,39,12,0,3,36,19,0,0,0,0,0,0,0,156,249,248,150,0,10,79,102,76,26,60,197,
+69,138,179,138,18,0,0,0,0,0,0,8,79,83,22,0,13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0,0,3,50,50,2,0,8,39,128,250,252,250,248,234,54,0,
+3,70,71,43,23,38,10,176,248,248,248,249,243,246,249,249,250,251,151,124,79,0,74,178,178,69,24,168,206,164,100,25,8,34,71,85,11,0,0,0,66,235,251,213,18,0,0,0,
+0,90,169,68,96,248,248,115,12,0,3,36,19,0,0,0,0,0,0,0,16,38,5,0,0,10,79,102,76,26,45,79,48,138,179,138,18,0,0,18,198,248,198,26,79,83,22,0,
+13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0,0,3,122,249,248,94,8,39,12,88,149,55,19,0,0,0,3,70,71,43,23,38,5,81,243,248,248,249,251,190,30,25,
+25,47,2,3,6,73,178,178,74,0,10,48,175,209,162,27,3,42,39,54,82,13,0,52,164,130,213,248,248,198,9,0,1,47,121,149,22,0,0,34,100,14,33,19,0,0,0,0,
+0,0,0,90,248,248,249,248,96,79,102,76,27,48,198,248,202,54,138,179,138,18,0,0,0,0,9,82,70,6,30,22,3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0,
+1,47,50,2,0,0,0,126,249,248,251,252,236,54,0,3,70,71,5,110,124,21,39,11,176,248,249,252,250,251,252,248,249,153,2,3,6,73,178,178,74,0,10,48,175,209,162,27,
+3,42,39,54,82,13,0,66,235,251,213,18,0,0,0,0,1,47,121,149,22,94,248,249,155,14,33,19,0,0,0,0,0,0,0,0,0,16,39,3,9,79,102,76,27,32,0,16,
+84,54,138,179,138,18,0,0,18,198,248,216,83,6,30,22,3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0,1,120,249,248,94,0,0,8,37,14,110,156,22,0,0,3,
+70,71,5,110,124,21,108,243,248,248,249,250,147,132,123,5,5,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155,57,9,10,33,55,82,60,163,120,68,210,248,248,201,18,0,
+1,22,4,88,148,19,19,149,93,58,26,0,37,19,0,0,0,0,90,248,248,94,101,249,250,156,76,27,48,199,248,203,36,89,56,138,179,138,18,0,0,9,82,71,3,0,0,33,
+49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0,1,22,4,0,0,0,126,248,248,250,249,238,165,16,3,70,71,3,0,7,122,122,19,38,11,183,252,250,249,248,252,252,
+132,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155,57,9,10,33,55,82,74,235,251,213,18,0,11,3,0,0,1,22,4,88,148,19,106,252,250,128,26,0,37,19,0,0,
+0,0,0,0,0,0,12,40,79,102,76,27,32,3,0,0,20,89,56,138,179,138,18,0,0,26,216,250,199,18,0,33,49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0,
+90,248,248,94,0,0,0,0,8,58,26,86,141,16,3,70,71,3,0,7,122,165,244,249,248,249,250,149,36,7,122,122,149,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207,
+158,31,0,13,33,94,189,116,65,207,248,198,204,249,199,18,0,0,0,0,83,140,140,84,34,23,34,62,156,39,0,0,0,90,248,248,94,0,8,146,251,250,107,48,199,248,203,26,
+44,29,87,56,138,179,138,18,9,82,71,2,0,0,6,34,39,21,0,19,143,127,6,0,0,0,0,0,12,84,77,7,0,0,0,0,0,126,248,248,249,249,233,64,76,137,86,71,
+3,0,0,0,5,122,122,15,55,174,247,249,248,248,248,241,159,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207,158,31,0,13,33,105,240,251,213,18,0,0,17,36,3,0,
+0,0,0,0,83,140,140,147,249,249,112,62,156,39,0,0,0,0,0,0,0,0,8,82,102,77,26,32,3,0,0,8,44,29,87,56,138,179,138,18,9,82,84,198,248,198,23,34,
+39,21,0,19,143,127,6,0,0,0,0,0,12,84,77,94,248,248,94,0,0,0,0,3,34,23,34,12,76,137,86,71,3,0,0,0,85,249,252,248,250,250,149,36,3,0,5,128,
+141,113,76,178,178,74,0,10,34,40,88,28,0,6,50,168,203,156,33,0,60,175,127,108,209,248,194,9,18,202,249,199,18,0,0,0,18,168,169,52,19,0,58,174,64,0,0,0,
+90,248,248,94,0,12,79,102,144,249,249,216,248,203,27,57,33,0,19,88,56,138,179,142,94,71,2,0,0,6,38,13,0,33,28,123,131,43,6,0,0,0,0,0,0,14,83,79,
+14,0,0,0,130,248,248,249,248,230,56,36,16,130,177,25,0,0,0,0,0,5,117,121,165,241,249,248,248,248,248,250,233,125,76,178,178,74,0,10,34,40,88,28,0,6,50,168,
+203,156,33,0,74,237,251,222,28,0,0,0,0,19,36,3,0,0,0,0,18,168,169,52,106,248,249,203,64,0,0,0,0,0,0,0,0,12,79,102,79,48,32,2,0,0,10,57,
+33,0,19,88,56,138,179,142,94,71,2,18,198,248,206,30,0,33,28,123,131,43,6,0,0,0,0,0,0,14,144,250,248,94,0,0,0,0,3,36,19,0,8,36,16,130,177,25,
+0,0,0,81,243,248,252,252,249,160,36,2,0,0,10,66,0,142,179,178,74,0,10,33,40,88,28,0,6,38,13,21,165,204,150,75,156,121,82,217,250,197,9,0,0,18,202,249,
+199,18,0,22,147,83,105,154,19,48,159,59,38,13,0,0,126,248,94,3,8,73,102,76,26,127,249,248,219,28,62,36,0,0,0,20,88,54,142,203,170,20,0,0,6,38,14,0,
+0,6,140,136,6,14,35,6,0,0,0,0,0,0,14,83,85,12,0,130,248,248,249,248,230,50,0,8,88,74,89,148,22,0,0,4,6,0,27,195,247,249,249,248,248,248,250,249,
+248,234,186,178,74,0,10,33,40,88,28,0,6,38,13,21,165,204,150,88,233,251,216,67,82,13,0,0,0,0,19,36,3,0,0,22,147,83,105,154,19,124,252,249,115,13,0,0,
+0,0,0,3,8,73,102,76,26,38,36,6,0,10,62,36,0,0,0,20,88,54,142,203,170,20,0,0,24,206,248,198,18,6,140,136,6,14,35,6,0,0,0,0,0,90,248,250,
+148,12,0,0,0,3,36,19,0,0,0,8,88,74,89,148,22,0,81,243,248,248,249,251,189,41,36,6,0,10,62,37,72,170,178,74,0,10,33,40,88,28,0,6,38,14,0,0,
+20,159,203,194,128,64,209,249,207,89,13,0,0,0,18,202,249,199,39,148,90,36,19,81,152,149,48,0,2,38,13,0,0,50,0,6,35,46,69,28,47,198,248,249,248,129,37,0,
+0,0,0,0,17,82,99,168,180,138,18,6,38,14,0,0,5,123,124,38,24,0,13,38,6,0,0,0,0,0,0,13,78,84,136,248,248,249,248,230,45,0,3,68,71,36,12,88,
+148,22,0,6,37,31,168,246,251,252,248,249,128,191,249,248,250,253,241,89,0,10,33,40,88,28,0,6,38,14,0,0,20,159,206,241,251,212,27,32,55,82,13,0,0,0,0,19,
+36,3,22,148,90,36,19,81,152,149,125,248,248,114,13,0,0,0,0,6,35,46,69,28,32,1,13,34,16,60,37,0,0,0,0,0,17,82,99,168,180,138,18,6,38,31,198,248,
+199,132,124,38,24,0,13,38,6,0,0,0,90,248,248,102,78,84,12,0,3,36,19,0,0,0,3,68,71,36,12,88,148,96,243,248,249,249,250,147,132,121,17,34,16,60,37,0,
+178,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,66,195,209,173,213,248,197,41,55,82,13,0,0,0,18,202,250,231,101,36,19,0,46,174,152,16,7,44,10,36,14,
+0,0,0,0,10,33,24,46,199,248,203,117,250,249,90,0,0,0,0,0,6,82,102,56,138,179,141,53,14,0,0,5,123,124,6,1,33,24,0,14,38,6,0,0,0,0,0,0,
+13,172,250,248,249,248,230,45,0,3,70,71,2,5,38,13,88,148,23,0,32,183,246,249,248,252,252,132,73,42,171,250,253,253,250,207,31,33,40,88,28,0,6,38,14,0,0,0,
+0,79,242,254,237,47,0,13,33,55,82,13,0,0,0,0,19,55,149,89,36,19,0,46,174,152,16,98,249,248,113,14,0,0,0,0,10,33,24,30,3,0,0,20,82,41,0,0,
+0,0,0,0,6,82,102,56,138,179,141,53,14,0,18,199,252,226,23,1,33,24,0,14,38,6,0,90,248,248,94,0,13,78,84,16,32,19,0,0,0,3,70,71,2,5,38,13,
+141,250,249,248,249,251,152,33,7,122,122,25,73,38,0,74,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,52,157,124,177,245,252,200,9,13,33,54,80,28,0,0,0,
+40,233,251,206,35,0,53,157,48,81,148,26,70,68,6,36,14,0,0,0,0,28,70,200,248,203,27,59,163,252,248,90,0,0,0,9,82,66,24,86,56,140,190,144,18,0,6,122,
+124,6,0,0,1,32,12,0,14,38,5,0,22,2,0,1,169,252,251,251,249,230,41,0,3,70,71,3,0,0,7,39,13,88,141,83,189,246,250,248,248,248,184,153,46,32,81,229,
+253,250,248,248,213,63,88,28,0,6,38,14,0,0,0,0,66,233,252,238,206,156,24,0,13,33,54,80,28,0,0,0,24,155,110,34,18,0,53,157,48,81,148,26,138,250,248,113,
+14,0,0,0,0,28,56,10,0,0,10,59,109,140,11,0,0,0,0,9,82,66,24,86,56,140,190,144,18,0,6,132,225,248,198,18,1,32,12,0,14,38,93,248,249,96,0,1,
+63,133,86,96,27,0,0,0,3,70,71,3,0,0,7,107,244,250,252,250,251,156,56,10,0,5,127,153,46,32,78,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,52,
+167,118,67,211,252,243,148,17,0,12,30,74,99,16,0,13,141,101,208,249,198,18,55,52,0,0,88,148,25,70,68,6,36,14,0,0,24,46,200,249,205,26,62,37,11,175,252,248,
+90,0,9,82,71,3,0,17,86,78,142,179,137,30,117,124,13,0,0,0,0,0,2,0,0,14,32,44,53,4,0,142,252,253,252,251,235,51,0,3,70,71,3,0,0,0,0,7,
+38,11,120,221,249,249,248,249,248,113,66,140,112,86,190,182,192,248,248,249,249,223,52,0,6,38,14,0,0,0,0,66,236,251,213,36,163,204,144,17,0,12,30,74,99,16,0,13,
+141,89,45,45,1,0,55,52,0,0,88,148,25,138,250,248,113,14,0,0,24,30,11,38,8,9,62,37,11,129,142,11,0,0,9,82,71,3,0,17,86,78,142,179,137,30,117,124,
+30,198,248,198,18,0,2,0,0,99,249,249,128,4,0,4,131,179,153,90,82,12,0,3,70,71,3,0,0,0,81,243,249,248,252,253,190,44,9,38,8,9,66,140,112,86,190,180,
+4,8,33,40,88,28,0,6,38,14,0,0,0,0,52,167,134,75,207,248,198,166,204,144,17,0,48,63,56,82,13,7,47,36,32,202,249,199,18,0,0,0,0,88,148,24,70,68,
+6,36,12,21,48,198,248,205,54,61,35,0,0,5,175,252,248,96,82,71,2,0,0,3,46,90,56,136,179,169,118,16,61,16,0,0,0,0,0,0,0,0,49,69,10,0,144,248,
+249,252,253,241,114,82,18,66,70,3,0,0,0,0,0,0,3,80,201,250,253,249,248,248,130,61,35,0,142,179,175,99,9,170,249,249,250,249,207,32,38,14,0,0,0,0,66,236,
+251,215,18,0,19,163,204,144,17,0,48,63,56,82,13,7,47,36,16,16,36,3,0,0,0,0,0,88,148,24,138,250,248,113,12,21,33,1,0,8,38,61,35,0,0,5,129,141,
+6,8,82,71,2,0,0,3,46,90,56,136,179,169,118,16,61,32,198,248,198,18,0,0,90,248,249,138,10,0,0,0,24,156,183,137,87,82,18,66,70,3,0,0,0,81,243,248,
+248,251,251,203,160,22,0,8,38,61,35,0,142,179,175,99,40,34,39,88,28,0,6,38,14,0,0,0,0,52,164,118,82,218,248,194,55,36,162,204,145,56,53,16,31,55,81,17,
+32,19,0,18,202,249,199,18,0,0,0,0,98,150,24,70,68,6,47,54,198,248,203,26,61,56,7,0,0,0,5,174,252,250,135,2,0,0,6,38,10,16,88,62,171,179,134,15,
+30,64,14,1,48,22,0,0,0,45,53,17,35,147,248,248,249,249,240,191,136,82,100,68,0,0,0,0,0,0,0,0,59,207,249,250,250,252,249,109,61,56,7,72,170,179,142,12,
+40,38,181,250,249,248,248,214,39,0,0,0,0,66,235,251,216,70,14,1,47,36,162,204,145,56,53,16,31,55,81,17,32,19,0,0,19,36,3,0,0,0,0,0,98,150,24,138,
+250,248,120,39,0,0,0,8,61,56,7,0,0,0,5,127,140,83,70,2,0,0,6,38,10,16,88,62,171,179,134,15,30,64,31,198,249,203,18,90,248,249,127,17,35,6,0,3,
+36,38,142,179,136,82,100,68,0,0,0,0,81,243,248,248,250,252,187,58,87,148,22,8,61,56,7,72,170,179,142,12,43,58,86,27,0,6,38,14,0,0,0,0,52,164,120,68,
+207,249,208,60,47,4,18,162,208,168,19,0,13,32,55,95,28,0,0,0,18,202,249,199,18,0,0,0,0,89,148,24,67,76,46,205,248,203,27,62,35,9,38,10,0,0,0,10,
+197,253,248,90,0,6,38,14,0,0,22,165,141,135,179,138,18,28,58,53,46,6,0,0,46,55,4,0,155,249,248,249,248,221,58,145,179,163,101,79,11,0,0,0,0,0,0,60,
+208,249,250,249,248,250,194,79,35,9,101,181,178,76,112,125,43,58,89,172,248,248,249,248,212,27,0,0,66,235,251,213,18,27,58,53,47,4,18,162,208,168,19,0,13,32,55,95,
+28,0,0,0,0,19,36,3,0,0,0,0,0,89,148,24,136,250,249,111,15,0,10,62,35,9,38,10,0,0,0,10,163,167,12,0,0,6,38,14,0,0,22,165,141,135,179,138,
+18,28,58,68,208,248,216,248,249,128,4,0,14,36,9,34,19,0,20,145,179,163,101,79,11,0,0,81,243,248,248,250,252,187,54,31,14,88,152,79,35,9,101,181,178,76,112,125,
+142,93,53,1,5,38,14,0,0,0,0,52,164,120,68,207,248,194,66,76,17,0,1,57,178,170,22,0,0,13,52,62,79,13,0,0,0,18,202,249,199,18,0,0,0,0,88,148,
+42,96,213,248,207,28,62,37,0,0,10,39,10,0,9,75,65,176,252,248,93,38,14,0,0,5,122,131,88,57,138,179,138,19,59,76,17,0,1,46,54,5,9,158,248,248,250,248,
+221,36,0,24,177,199,135,84,85,12,0,0,0,0,62,208,249,250,248,248,248,106,128,163,23,69,181,190,81,0,14,139,142,93,53,6,164,249,248,248,248,212,27,66,235,251,213,18,
+0,1,59,76,17,0,1,57,178,170,22,0,0,13,52,62,79,13,0,0,0,0,19,36,3,0,0,0,0,0,88,148,42,147,250,248,103,11,62,37,0,0,10,39,10,0,9,75,
+65,130,140,10,5,38,14,0,0,5,122,131,88,57,138,179,138,19,59,76,34,216,248,249,137,5,9,22,0,14,58,21,0,0,0,24,177,199,135,84,85,12,81,243,248,248,250,252,
+187,52,0,6,22,11,128,163,23,69,181,190,81,0,14,139,168,136,13,36,36,11,0,0,0,0,52,164,120,72,207,248,195,57,44,28,59,16,39,51,19,55,84,12,0,31,28,29,
+54,82,13,0,0,0,18,202,249,199,18,0,0,0,0,102,168,204,250,217,29,57,36,0,0,0,0,10,33,16,79,68,1,5,175,252,249,97,0,0,5,122,122,5,17,87,60,138,
+180,161,58,28,59,16,39,52,4,0,162,250,249,249,249,225,41,0,3,70,87,149,179,130,82,84,12,0,0,52,205,249,250,248,248,248,103,59,36,81,156,173,175,81,35,16,29,44,
+168,136,13,36,41,166,248,248,248,248,223,236,251,213,18,0,3,50,44,28,59,16,39,51,19,55,84,12,0,31,28,29,54,82,13,0,0,0,0,19,34,3,0,0,0,0,0,102,
+160,28,138,250,248,127,36,0,0,0,0,10,33,16,79,68,1,5,129,141,41,11,0,0,5,122,122,5,17,87,60,138,180,161,58,28,128,248,249,250,199,18,22,87,31,24,28,32,
+6,0,3,70,87,149,179,130,82,138,243,248,248,249,251,187,52,0,0,0,7,59,36,81,156,173,175,81,35,16,29,44,32,122,125,46,38,20,23,0,0,52,164,120,72,207,248,195,
+59,46,1,0,26,73,49,1,0,0,50,82,40,14,0,12,32,55,82,13,0,0,0,18,202,249,199,18,0,0,24,47,218,252,208,83,94,33,0,0,0,0,0,0,14,93,73,1,
+0,0,11,185,252,248,105,5,122,122,5,0,0,17,85,60,159,193,138,18,26,73,49,1,0,154,248,249,251,249,221,42,34,11,68,70,3,25,150,179,127,82,84,12,40,151,249,250,
+248,248,248,100,60,34,0,69,179,179,86,0,16,52,43,86,32,122,125,46,38,25,170,248,248,249,252,251,217,18,0,4,52,46,1,0,26,73,49,1,0,0,50,82,40,14,0,12,
+32,55,82,13,0,0,0,0,18,35,3,0,0,0,24,31,88,148,23,138,250,249,90,0,0,0,0,0,14,93,73,1,0,0,11,144,142,25,23,5,122,122,5,0,0,17,85,60,
+159,193,138,101,249,250,134,198,248,198,18,30,101,42,0,13,34,11,68,70,3,25,150,179,168,247,250,248,249,248,169,52,0,0,0,10,60,34,0,69,179,179,86,0,16,52,43,86,
+0,5,129,127,30,58,8,0,52,164,120,72,207,248,195,60,48,2,0,2,44,59,55,15,0,0,0,70,89,11,0,0,13,33,55,82,13,0,0,0,18,202,249,199,18,24,48,198,
+248,221,160,74,82,66,2,0,0,0,0,9,80,73,35,8,0,0,14,14,179,253,249,167,122,5,0,0,0,0,20,102,85,138,179,139,59,59,55,15,158,248,248,249,249,233,57,0,
+14,88,70,2,0,0,26,152,179,126,78,89,145,248,250,248,248,248,96,62,37,0,74,178,173,123,135,31,31,44,100,34,0,5,129,127,30,58,13,162,249,252,251,249,219,27,4,53,
+48,2,0,2,44,59,55,15,0,0,0,70,89,11,0,0,13,33,55,82,13,0,0,0,0,19,36,3,0,24,33,1,0,88,152,74,146,250,248,90,0,0,0,9,80,73,35,8,
+0,0,14,14,135,150,26,119,122,5,0,0,0,0,20,102,85,138,206,252,250,131,55,32,198,248,199,46,44,86,30,0,14,88,70,2,0,0,26,184,251,252,250,250,248,151,52,0,
+0,0,10,62,37,0,74,178,181,163,135,31,31,44,100,34,10,0,5,131,139,20,36,54,163,120,72,207,248,195,61,47,1,0,2,49,51,3,25,64,16,1,35,15,48,84,13,0,
+0,13,33,55,82,13,0,0,0,18,202,249,203,62,198,248,203,27,129,163,25,69,70,3,0,0,9,82,71,1,8,37,7,0,0,17,35,172,252,252,92,0,0,0,0,4,49,53,
+82,58,138,193,162,21,29,182,248,248,249,248,221,53,87,29,62,73,35,5,0,0,0,27,153,179,144,153,248,250,248,248,243,96,62,37,0,74,178,178,72,0,93,162,58,86,35,32,
+10,0,5,131,139,20,36,72,245,251,249,248,248,218,75,47,1,0,2,49,51,3,25,64,16,1,35,15,48,84,13,0,0,13,33,55,82,13,0,0,0,0,18,31,24,32,1,0,
+0,10,129,163,25,138,250,248,90,0,9,82,71,1,8,37,7,0,0,17,35,123,178,118,3,0,0,0,0,4,49,53,82,127,252,253,196,21,25,64,33,198,249,202,18,30,87,29,
+62,73,35,5,0,0,81,244,252,253,252,248,151,58,0,0,0,10,62,37,0,74,178,186,231,243,145,162,58,86,35,32,39,8,17,41,124,113,61,172,119,71,207,248,195,61,46,1,
+0,4,49,51,3,0,0,26,61,42,15,0,0,50,85,17,0,0,13,33,55,82,13,0,0,0,18,206,250,238,248,203,27,62,37,88,148,23,70,70,0,8,82,71,2,0,0,7,
+37,8,17,36,6,115,201,252,248,90,0,0,5,54,46,0,15,83,86,159,180,140,165,249,250,249,248,217,27,0,38,102,75,0,12,38,6,0,0,0,30,172,223,251,250,250,248,243,
+97,62,37,0,74,178,178,74,0,10,33,114,185,47,0,10,39,8,17,41,124,113,76,236,251,236,248,248,248,250,224,28,0,4,49,51,3,0,0,26,61,42,15,0,0,50,85,17,
+0,0,13,33,55,82,13,0,0,0,0,33,53,1,0,0,10,62,37,88,148,23,138,250,248,95,82,71,2,0,0,7,37,8,17,36,6,115,170,136,9,0,0,0,5,54,46,0,
+100,250,251,194,180,138,18,26,61,57,201,248,198,18,38,102,75,0,12,38,6,81,243,248,249,252,253,198,90,78,12,0,10,62,37,0,74,178,186,231,248,248,245,159,185,47,0,10,
+8,46,38,2,0,134,182,122,91,207,248,195,61,46,0,0,0,43,51,3,0,0,0,0,48,66,15,0,0,0,50,42,0,0,0,13,33,55,82,13,0,0,21,105,243,249,241,62,
+62,37,0,0,112,157,22,67,67,77,69,2,0,0,0,0,7,46,38,7,122,119,18,174,252,248,90,5,54,46,0,0,0,48,102,61,140,227,252,249,249,250,219,27,0,13,78,65,
+81,29,0,14,38,6,0,0,42,120,202,247,251,250,247,101,58,37,0,74,189,185,74,0,10,33,40,88,106,148,22,0,8,46,38,2,0,143,239,251,217,25,158,248,250,249,248,217,
+27,43,51,3,0,0,0,0,48,66,15,0,0,0,50,42,0,0,0,13,33,55,82,13,0,0,21,82,70,36,32,30,62,37,0,0,112,157,22,136,250,250,135,2,0,0,0,0,
+7,46,38,7,122,119,18,127,142,11,0,5,54,46,0,90,248,249,158,61,138,179,138,18,48,66,32,198,248,201,90,65,81,29,0,14,107,243,248,248,249,248,215,194,117,77,82,23,
+58,37,0,74,189,185,128,243,248,249,249,247,153,148,22,0,17,38,36,10,50,149,173,152,210,249,197,61,45,0,0,0,0,14,3,0,0,0,3,36,15,24,64,18,0,0,0,0,
+0,0,0,0,13,33,55,82,12,19,96,221,250,241,251,237,69,0,0,0,24,130,155,31,102,98,5,0,0,0,0,0,16,38,40,127,122,5,0,5,176,252,248,125,45,0,0,0,
+0,10,21,88,184,252,253,252,249,216,84,14,11,84,50,0,29,90,30,0,14,37,4,41,101,102,80,168,243,248,137,102,42,0,74,178,185,120,20,8,33,40,88,28,0,88,148,22,
+17,38,36,10,64,231,253,232,33,34,16,178,249,248,248,248,217,39,3,0,0,0,3,36,15,24,64,18,0,0,0,0,0,0,0,0,13,33,55,82,12,19,84,102,89,28,96,174,
+55,0,0,0,24,130,155,31,158,251,248,90,0,0,0,0,16,38,40,127,122,5,0,5,129,140,16,54,45,0,90,248,248,100,21,85,62,138,180,154,32,24,64,31,200,250,209,18,
+29,90,30,81,244,249,248,249,248,151,80,158,168,109,77,102,42,0,74,178,185,120,20,87,245,249,250,249,243,141,148,22,55,1,9,76,164,118,73,230,252,199,75,44,0,0,0,0,
+0,0,0,31,3,1,34,19,0,0,27,64,18,0,0,0,0,0,0,0,0,13,33,53,82,96,221,250,207,41,212,251,231,39,0,0,0,19,127,182,80,64,68,3,0,0,0,15,
+34,6,126,140,9,0,0,0,5,177,253,249,90,0,0,0,0,0,5,172,250,250,252,253,235,43,23,64,85,48,0,0,0,30,90,30,0,10,63,100,102,52,0,36,161,196,142,84,
+80,82,178,178,74,20,63,43,39,88,28,0,0,0,88,156,55,1,9,89,235,251,213,132,122,21,69,44,158,248,248,248,248,221,27,31,3,1,34,19,0,0,27,64,18,0,0,0,
+0,0,0,0,0,13,33,53,82,84,102,92,21,7,64,124,148,22,0,0,0,19,127,182,80,135,250,248,90,0,0,15,34,6,126,140,9,0,0,0,5,130,158,49,0,90,248,248,
+94,0,0,16,85,62,150,184,138,18,23,64,97,209,248,198,18,30,143,244,248,248,250,248,151,52,0,36,150,170,142,84,80,82,178,178,74,20,63,43,107,247,249,248,248,243,141,156,
+149,19,48,164,121,72,207,248,224,154,53,32,6,0,0,0,0,0,47,102,63,31,16,0,0,0,0,26,63,18,0,0,0,0,0,0,0,0,9,43,104,221,250,207,24,62,50,201,
+251,231,39,0,0,6,84,151,156,22,70,70,3,0,20,35,6,122,122,8,2,0,0,0,8,57,187,252,248,90,0,0,0,5,167,248,248,251,250,233,187,143,27,89,86,14,0,0,
+0,0,30,89,27,37,101,102,54,0,0,0,42,177,189,108,128,204,182,74,0,7,43,73,90,25,0,0,0,0,20,112,149,19,62,234,251,213,18,5,126,150,53,32,6,158,248,248,
+248,248,227,118,63,31,16,0,0,0,0,26,63,18,0,0,0,0,0,0,0,0,9,43,93,102,90,17,6,62,34,15,111,149,22,0,0,6,84,151,156,22,138,250,248,90,20,35,
+6,122,122,8,2,0,0,0,8,57,148,139,98,248,248,94,0,0,0,0,16,98,71,138,179,143,27,89,86,31,198,248,198,93,244,250,249,249,248,151,54,0,0,0,42,177,189,108,
+128,204,182,74,0,7,43,73,90,98,243,248,248,248,244,157,136,152,153,115,72,207,248,194,50,145,122,18,38,6,0,0,0,0,27,92,102,70,0,0,0,0,0,0,26,62,18,0,
+0,0,0,0,0,0,19,97,221,251,219,36,58,37,0,18,202,251,231,39,9,82,67,22,128,156,22,69,70,3,19,8,122,122,5,0,0,0,0,0,38,45,5,175,252,248,90,0,
+5,171,248,248,249,249,223,82,143,137,92,47,22,63,18,0,0,0,0,26,92,100,102,58,30,6,0,10,62,69,155,179,183,196,132,10,6,33,39,90,72,17,0,0,0,1,21,3,
+81,159,232,251,213,18,0,0,42,145,122,18,38,6,158,248,248,248,249,233,118,70,0,0,0,0,0,0,26,62,18,0,0,0,0,0,0,0,19,85,102,96,78,20,58,37,0,0,
+19,112,149,22,9,82,67,22,128,156,22,138,250,248,102,8,122,122,5,0,0,0,0,0,38,45,5,173,252,248,94,0,0,0,0,3,31,30,82,63,143,137,92,47,22,63,35,198,
+248,247,248,249,250,248,150,58,30,6,0,10,62,69,155,179,183,196,132,10,6,33,39,90,72,17,81,243,248,248,248,243,245,203,186,84,207,248,194,9,4,5,122,122,19,38,6,0,
+0,0,0,48,94,102,62,2,0,0,0,11,71,62,62,18,0,0,0,0,0,22,98,221,250,212,70,102,43,0,0,0,18,202,251,232,107,71,2,0,22,130,156,22,69,70,5,122,
+122,5,0,0,0,0,0,0,4,0,0,5,176,252,248,93,171,248,248,249,248,207,36,81,65,82,50,0,0,26,64,18,0,0,0,39,100,102,66,0,13,34,16,60,37,0,98,179,
+179,137,76,84,40,39,87,25,18,64,22,0,0,0,0,0,62,238,253,217,18,0,0,0,4,5,122,122,19,38,6,154,248,248,248,249,233,121,62,2,0,0,0,11,71,62,62,18,
+0,0,0,0,0,22,86,102,91,44,56,102,43,0,0,0,0,19,109,153,96,71,2,0,22,130,156,22,138,250,248,169,122,5,0,0,0,0,0,0,4,0,90,248,252,183,11,0,
+0,0,3,36,19,0,15,81,65,82,50,0,0,26,64,105,247,248,248,249,248,151,66,0,13,34,16,60,37,0,98,179,179,137,76,84,40,39,87,25,18,64,22,81,243,248,248,248,
+252,248,170,235,249,194,9,0,0,0,5,122,122,19,38,6,0,3,36,14,22,92,102,63,2,0,11,80,102,71,26,64,19,0,0,0,22,98,221,250,206,32,66,70,78,13,0,0,
+0,18,203,252,237,40,0,0,0,22,130,156,20,70,158,124,5,0,0,0,0,0,0,0,0,0,0,0,5,176,252,248,248,248,249,248,207,22,0,26,102,75,0,0,0,0,26,64,
+18,0,42,101,102,66,80,29,0,20,73,38,0,70,173,174,168,179,111,83,88,82,25,0,0,22,64,22,0,0,0,66,234,251,227,156,22,0,0,0,0,0,5,122,122,19,38,6,
+154,248,249,248,249,233,121,63,2,0,11,80,102,71,26,64,19,0,0,0,22,86,102,90,16,16,66,70,78,13,0,0,0,0,22,148,177,24,0,0,0,22,130,156,20,139,253,252,
+94,0,0,0,0,0,0,0,0,90,248,248,97,129,142,11,0,3,36,19,0,0,0,26,102,75,0,0,0,0,99,246,248,248,249,250,158,66,80,29,0,20,73,38,0,70,173,174,
+168,179,111,83,88,82,25,0,0,22,64,22,81,243,248,249,251,249,247,250,229,31,0,0,0,0,0,5,122,122,19,36,9,34,19,0,0,23,92,102,61,18,80,102,78,9,0,25,
+64,19,0,22,99,221,250,207,24,59,42,30,55,82,13,0,0,9,91,215,251,231,39,0,0,0,22,128,144,121,154,71,1,0,0,0,0,0,0,0,0,0,0,0,0,14,230,252,
+248,249,248,207,18,0,13,80,55,77,48,0,0,0,0,25,56,54,100,102,52,0,29,87,37,53,42,32,71,168,178,68,43,169,188,128,102,86,8,0,0,0,22,64,22,0,66,234,
+251,213,18,88,148,22,0,0,0,0,0,5,122,122,19,36,9,168,248,248,248,249,233,121,61,18,80,102,78,9,0,25,64,19,0,22,87,102,90,17,6,59,42,30,55,82,13,0,
+0,9,79,76,110,149,22,0,0,0,22,128,144,121,192,250,248,90,0,0,0,0,0,0,90,248,248,94,0,5,129,141,14,34,19,0,0,0,13,80,55,77,48,0,0,81,243,249,
+250,250,250,251,210,18,29,87,37,53,42,32,71,168,178,68,43,169,188,128,102,86,8,0,0,0,22,64,22,81,245,252,249,248,248,247,145,148,22,0,0,0,0,0,5,122,122,19,
+58,21,0,0,0,0,23,90,102,94,102,75,9,13,4,0,25,58,35,97,221,250,206,24,62,37,0,12,33,55,82,11,7,82,71,19,202,236,161,22,0,0,0,22,178,185,27,62,
+62,2,0,0,0,0,0,0,0,0,0,0,9,176,248,252,253,248,219,18,0,13,84,50,0,14,85,48,0,15,3,0,56,102,102,50,0,0,0,36,102,55,0,84,180,169,74,0,
+10,75,181,204,119,74,84,12,0,0,0,22,64,80,234,251,213,18,0,0,88,148,22,0,0,0,0,0,5,122,122,19,58,21,154,248,248,248,249,233,121,94,102,75,9,13,4,0,
+25,58,35,85,102,89,16,6,62,37,0,12,33,55,82,11,7,82,71,1,16,112,149,22,0,0,0,22,178,185,27,133,250,248,90,0,0,0,0,90,248,248,94,0,0,0,5,129,
+152,25,0,0,0,13,84,50,0,14,85,48,81,244,248,248,250,248,158,209,248,198,18,36,102,55,0,84,180,169,74,0,10,75,181,204,119,74,84,12,0,0,0,22,64,67,192,248,
+247,248,248,248,243,141,148,22,0,0,0,0,0,5,124,139,33,34,6,0,0,0,0,34,102,102,97,24,0,19,36,3,0,38,108,221,250,202,24,62,37,0,0,0,13,33,53,78,
+78,68,2,0,18,44,112,150,23,0,5,121,124,128,154,22,67,69,3,0,0,0,0,0,0,0,0,9,180,248,248,249,252,252,248,90,13,84,50,0,0,0,22,96,36,15,29,43,
+99,102,82,16,0,0,10,56,56,84,95,178,173,95,4,8,34,40,120,178,179,100,78,86,12,0,0,0,81,239,251,213,18,0,0,0,0,88,148,22,0,0,0,0,0,5,124,139,
+33,34,6,154,248,248,248,249,235,124,97,24,0,19,36,3,0,38,97,102,86,16,6,62,37,0,0,0,13,33,53,78,78,68,2,0,0,19,112,150,23,0,5,121,124,128,154,22,
+136,250,248,90,0,0,90,248,248,94,0,0,0,0,3,37,137,140,11,0,13,84,50,0,0,0,22,147,245,248,249,249,248,151,82,33,198,248,200,70,56,84,95,178,173,95,4,8,
+34,40,120,178,179,100,78,86,12,0,0,0,67,182,121,137,248,247,248,248,248,243,141,150,31,0,0,0,0,3,40,132,122,19,38,6,0,0,13,79,102,100,102,80,16,0,18,30,
+24,96,221,251,205,23,62,37,0,0,0,0,0,10,36,92,102,15,0,0,0,0,19,102,145,34,121,124,4,22,130,158,20,70,70,3,0,0,0,0,0,0,9,180,248,248,249,248,
+199,181,252,248,144,50,0,0,0,0,1,44,35,0,53,112,103,49,22,63,18,9,62,37,0,95,205,187,71,12,40,34,40,88,28,52,170,179,98,66,83,13,0,72,234,251,221,35,
+0,0,0,0,0,0,88,150,31,0,0,0,0,3,40,132,122,19,38,6,149,248,248,250,251,234,124,80,16,0,18,30,24,84,102,102,32,6,62,37,0,0,0,0,0,10,36,92,
+102,15,0,0,0,0,19,102,145,34,121,124,4,22,130,158,20,138,250,248,90,90,248,248,94,0,0,0,0,3,36,19,5,129,139,24,83,50,0,0,0,0,82,245,249,248,250,248,
+151,49,22,63,34,200,250,206,18,95,205,187,71,12,40,34,40,88,28,52,170,179,98,66,83,13,0,58,160,121,106,241,199,87,243,248,248,248,243,139,151,22,0,0,3,36,19,5,
+122,122,19,38,3,12,83,102,72,30,90,102,83,15,0,34,105,221,250,206,68,62,53,93,13,0,0,0,0,7,82,82,54,80,13,0,0,0,0,0,81,175,135,6,0,0,21,134,
+154,22,69,70,3,0,0,0,0,9,185,248,248,249,248,198,18,5,179,253,250,90,0,0,0,0,0,1,27,57,173,167,72,0,0,22,60,62,34,0,74,178,187,138,28,4,39,58,
+86,26,0,0,53,171,179,88,50,84,77,235,251,213,35,62,21,0,0,0,0,0,0,86,151,22,0,0,3,36,19,5,122,122,19,38,3,154,250,251,250,249,233,124,83,15,0,34,
+94,102,85,36,54,62,53,93,13,0,0,0,0,7,82,82,54,80,13,0,0,0,0,0,81,175,135,6,0,0,21,134,154,22,138,250,248,248,248,94,0,0,0,0,3,36,19,0,
+0,5,134,173,55,0,0,0,0,81,243,248,249,250,251,195,72,0,0,22,60,75,206,248,214,184,187,138,28,4,39,58,86,26,0,0,53,171,179,88,50,84,63,163,113,62,202,250,
+67,22,81,243,248,248,248,243,141,149,22,3,36,19,0,0,5,122,122,15,42,84,102,75,8,0,20,92,102,79,35,96,221,251,202,22,64,83,147,179,93,0,0,0,9,82,68,16,
+32,55,82,13,0,0,0,0,100,155,138,20,0,0,0,18,128,156,22,69,70,3,0,0,9,185,248,248,249,248,194,18,0,13,85,190,252,248,90,0,0,0,0,0,47,176,176,55,
+14,34,2,7,63,70,18,74,178,178,74,28,89,52,38,90,53,2,0,0,0,57,171,179,79,100,240,251,213,18,0,20,64,22,0,0,0,0,0,0,88,149,22,3,36,19,0,0,
+5,122,122,15,42,84,191,250,248,248,248,233,124,79,35,84,102,96,17,5,64,83,147,179,93,0,0,0,9,82,68,16,32,55,82,13,0,0,0,0,100,155,138,20,0,0,0,18,
+128,156,22,178,250,248,150,0,0,0,0,3,36,19,0,0,0,13,85,152,138,11,0,0,81,243,248,248,249,251,202,55,14,34,2,7,63,70,34,214,253,238,87,28,89,52,38,90,
+53,2,0,0,0,57,171,179,79,89,188,115,62,198,248,207,45,61,22,81,243,248,248,248,243,142,148,55,19,0,0,0,0,5,122,128,91,102,75,6,0,16,13,18,88,102,112,221,
+250,204,31,60,49,148,198,148,25,0,0,9,82,71,3,0,13,33,54,82,17,0,0,110,133,14,84,148,22,0,0,0,21,130,156,22,69,70,3,9,190,248,248,249,248,194,18,0,
+13,84,50,5,175,252,248,90,0,15,14,45,175,176,72,14,0,14,19,60,33,22,119,184,178,74,0,6,52,91,90,22,9,38,5,4,9,0,58,167,184,236,251,223,28,0,3,59,
+45,61,22,0,0,0,0,0,0,90,148,55,19,0,0,0,0,5,122,128,91,102,75,151,248,248,248,248,233,124,101,102,82,27,14,60,49,148,198,148,25,0,0,9,82,71,3,0,
+13,33,54,82,17,0,0,110,133,14,84,148,22,0,0,0,21,130,191,249,250,250,248,90,0,0,3,36,19,0,0,0,13,84,50,5,129,142,11,81,243,248,248,249,251,202,72,14,
+0,14,19,60,33,22,119,190,238,250,198,24,52,91,90,22,9,38,5,4,9,0,58,167,178,170,124,107,200,248,204,73,4,20,64,22,81,243,248,248,248,243,158,155,22,0,0,0,
+0,0,19,166,175,80,35,4,0,5,36,9,40,102,118,235,204,21,61,52,138,179,149,78,21,0,9,82,71,2,0,0,0,12,34,70,82,22,121,135,12,0,0,88,148,22,0,0,
+0,22,130,156,22,69,73,191,248,248,249,248,194,14,0,13,84,50,0,0,5,175,252,248,90,2,66,175,176,56,3,34,16,7,61,37,0,74,185,198,89,0,10,33,39,90,90,29,
+14,13,38,37,9,10,23,107,239,254,225,61,82,19,66,71,4,20,64,22,0,0,0,0,0,3,113,155,22,0,0,0,0,0,19,166,175,80,35,4,144,248,249,248,249,235,127,101,
+29,4,61,52,138,179,149,78,21,0,9,82,71,2,0,0,0,12,34,70,82,22,121,135,12,0,0,88,148,22,0,0,0,104,251,252,108,138,250,248,90,3,36,19,0,0,0,13,
+84,50,0,0,5,129,177,243,248,248,250,251,202,56,3,34,16,7,61,37,0,74,185,198,101,198,248,206,54,90,90,29,14,13,38,37,9,10,23,96,183,203,118,208,250,207,80,71,
+0,0,22,64,22,81,243,248,248,249,244,143,147,22,0,0,0,15,86,105,160,125,17,38,6,0,0,45,88,102,102,118,91,59,50,138,179,138,18,23,60,26,78,71,2,0,0,0,
+0,4,42,37,57,166,143,11,0,0,0,0,88,148,22,0,0,0,22,130,156,22,69,161,248,249,248,194,14,0,13,84,50,0,0,0,0,5,175,252,248,117,174,176,64,0,0,1,
+36,65,36,0,74,178,178,90,62,27,29,41,87,24,26,99,153,54,43,40,13,37,76,230,252,242,184,78,48,102,70,1,0,0,22,64,22,0,0,0,3,36,19,91,147,22,0,0,
+0,15,86,105,160,125,17,38,6,144,248,249,250,251,235,127,79,59,50,138,179,138,18,23,60,26,78,71,2,0,0,0,0,4,42,37,57,166,143,11,0,0,0,0,88,148,22,0,
+90,248,248,176,156,22,138,250,248,112,19,0,0,0,13,84,50,0,0,0,0,85,249,252,248,249,251,202,64,0,0,1,36,65,36,0,74,178,178,90,62,43,204,249,218,41,26,99,
+153,54,43,40,13,37,62,145,139,193,238,250,213,113,70,1,0,0,0,22,64,22,81,243,249,248,248,243,143,147,22,0,16,86,102,72,11,124,110,16,38,3,22,89,102,85,31,88,
+102,92,138,179,138,18,0,0,27,101,76,0,0,0,0,0,6,38,12,19,144,161,88,13,0,0,0,0,0,88,150,22,0,0,0,22,130,156,22,68,170,248,194,9,0,13,84,50,
+0,0,0,0,0,0,5,172,252,253,203,57,28,18,0,10,60,37,0,74,178,178,74,0,28,70,52,84,28,0,0,30,124,179,59,19,61,78,234,249,205,78,175,180,121,84,78,11,
+0,0,0,22,64,22,0,3,36,19,0,0,91,147,22,0,16,86,102,72,11,124,110,16,38,3,154,250,251,250,249,233,127,92,138,179,138,18,0,0,27,101,76,0,0,0,0,0,
+6,38,12,19,144,161,88,13,0,0,0,0,0,88,150,105,248,248,94,22,130,156,22,137,250,248,90,0,0,13,84,50,0,0,0,0,81,243,248,252,252,251,200,57,28,18,0,10,
+60,37,0,74,178,178,74,0,28,70,66,217,249,198,18,30,124,179,59,19,61,65,159,51,26,213,253,240,130,84,78,11,12,0,0,0,22,63,23,102,244,248,248,248,243,143,147,37,
+90,102,69,6,0,9,42,1,10,46,89,102,82,37,18,62,106,185,199,140,18,0,0,9,78,76,58,20,0,0,0,4,36,14,1,128,141,39,55,82,13,0,0,0,0,1,107,156,
+22,0,0,0,22,129,157,48,75,140,12,0,13,84,50,0,46,22,0,0,0,0,0,47,223,254,250,90,2,32,24,58,37,0,74,178,178,74,0,10,29,53,102,43,0,0,0,0,
+52,125,169,62,79,237,249,203,18,0,69,198,199,79,63,87,12,0,0,0,22,63,23,31,19,0,0,0,0,91,147,37,90,102,69,6,0,9,42,1,10,46,89,188,250,249,248,250,
+235,196,199,140,18,0,0,9,78,76,58,20,0,0,0,4,36,14,1,128,141,39,55,82,13,0,0,0,0,1,160,252,249,94,0,0,22,129,157,48,142,250,248,90,13,84,50,0,
+46,22,0,81,243,248,248,249,253,221,61,0,2,32,24,58,37,0,74,178,178,74,0,10,29,53,102,58,198,248,198,18,52,125,169,62,66,172,56,18,198,248,217,202,199,79,63,87,
+87,12,0,0,0,22,75,33,81,243,248,248,248,243,150,184,114,93,23,0,0,0,0,0,22,91,102,83,10,8,72,55,146,206,185,80,4,0,9,82,71,1,20,64,23,0,0,2,
+7,2,116,130,8,14,34,55,82,13,0,0,0,0,4,109,154,22,0,0,0,22,137,161,22,69,66,19,82,50,0,0,24,64,20,0,0,0,46,173,171,186,252,248,90,11,72,44,
+0,74,178,178,74,0,10,34,41,83,44,58,23,0,0,2,3,29,118,178,234,249,211,24,0,3,70,121,180,169,22,64,87,12,0,0,0,22,75,33,0,0,0,0,0,0,103,184,
+114,93,23,0,0,0,0,0,22,91,102,83,144,248,250,250,252,249,196,80,4,0,9,82,71,1,20,64,23,0,0,2,7,2,116,130,8,14,34,55,82,13,0,0,0,90,248,251,
+191,22,0,0,0,22,137,161,22,138,250,248,143,50,0,0,24,64,94,243,248,248,249,251,198,146,135,11,0,11,72,44,0,74,178,178,74,0,10,34,41,83,44,58,39,198,248,198,
+21,29,118,172,161,56,54,200,248,203,83,121,180,169,22,64,64,87,12,0,3,30,34,60,22,81,243,248,248,248,247,188,175,44,61,19,0,0,0,24,92,102,84,38,13,59,52,152,
+183,145,102,102,65,17,80,71,2,0,0,23,55,5,0,0,2,117,130,8,0,0,14,33,55,82,13,0,0,0,0,1,111,156,22,0,3,30,34,128,156,22,69,102,48,0,0,0,
+0,23,64,18,0,46,175,176,54,2,175,252,248,128,36,30,87,178,178,74,0,10,34,40,88,28,0,23,55,5,0,0,0,0,84,241,252,213,31,36,11,68,71,3,71,60,1,0,
+64,87,12,0,3,30,34,60,22,0,0,0,0,17,88,158,175,44,61,19,0,0,0,24,92,102,84,38,13,167,250,252,253,252,238,127,65,17,80,71,2,0,0,23,55,5,0,0,
+2,117,130,8,0,0,14,33,55,82,13,0,90,248,248,94,111,156,22,0,3,30,34,128,156,22,138,251,249,90,0,0,0,97,246,248,248,249,251,202,54,2,130,140,21,59,36,30,
+87,178,178,74,0,10,34,40,88,28,0,23,55,22,198,248,198,18,72,193,170,62,201,249,205,81,71,3,71,60,1,0,0,64,86,16,31,19,0,22,64,22,81,243,248,250,251,246,
+146,146,42,64,18,0,12,89,102,81,9,17,73,53,138,180,154,30,16,88,102,96,67,1,0,0,0,0,4,0,0,3,118,128,8,0,0,0,0,13,33,55,82,13,0,0,0,0,
+3,112,155,23,36,19,0,22,127,161,88,83,64,2,0,0,0,0,24,56,57,175,176,55,0,0,5,177,253,249,90,76,189,184,74,0,10,34,42,88,28,0,0,0,4,0,0,0,
+0,69,233,250,227,175,55,14,88,71,2,0,0,0,0,0,0,64,86,16,31,19,0,22,64,22,0,0,18,89,102,69,96,146,42,64,18,0,12,89,102,81,9,17,73,53,202,253,
+252,249,248,236,127,96,67,1,0,0,0,0,4,0,0,3,118,128,8,0,0,0,0,13,33,55,82,98,248,248,94,0,3,112,155,23,36,19,0,22,127,161,88,146,250,248,90,0,
+81,243,249,250,250,251,202,55,0,0,5,132,158,40,0,76,189,184,74,0,10,34,42,88,28,0,0,0,4,0,18,198,248,210,165,69,128,235,249,206,100,71,2,0,0,0,0,0,
+0,0,63,98,26,0,0,0,22,64,18,93,247,251,250,248,243,145,145,43,62,28,76,102,80,9,8,59,58,153,181,138,21,36,10,26,102,102,67,3,0,0,0,0,0,0,4,119,
+127,7,0,0,0,0,0,0,13,33,55,82,13,0,0,0,0,2,110,167,36,0,0,0,31,155,173,24,68,70,3,0,0,0,0,60,176,176,45,0,0,0,9,66,199,252,250,205,
+179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,0,69,234,249,203,46,121,171,104,74,35,5,0,0,0,0,0,0,0,63,98,26,0,0,0,22,64,18,17,89,102,69,4,
+0,93,145,43,62,28,76,102,80,9,8,59,58,153,181,202,249,249,248,249,238,127,67,3,0,0,0,0,0,0,4,119,127,7,0,0,0,0,0,0,13,33,126,250,248,94,0,0,
+0,2,110,167,36,0,0,0,31,155,173,24,137,250,248,141,243,248,248,250,251,201,45,0,0,0,9,66,166,136,78,178,179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,18,
+210,252,209,35,205,251,237,114,74,35,5,0,0,0,0,0,0,2,30,70,84,12,0,0,0,18,67,91,151,246,248,248,248,243,145,145,42,87,102,78,9,8,62,52,138,183,156,24,
+0,1,35,80,69,86,102,68,4,0,0,0,0,4,121,126,6,0,0,0,0,0,0,8,0,13,33,55,82,13,0,0,0,2,34,117,154,22,0,13,80,61,125,156,22,69,70,3,
+0,0,46,174,176,82,12,0,0,10,58,81,102,209,253,253,138,2,38,42,40,88,28,0,0,0,0,0,0,0,0,69,234,249,203,18,0,30,131,189,56,12,38,6,0,0,0,0,
+0,2,30,70,84,12,0,0,0,18,67,91,102,68,4,0,0,0,93,145,42,87,102,78,9,8,62,52,138,183,156,24,140,248,249,250,250,238,127,68,4,0,0,0,0,4,121,126,
+6,0,0,0,0,0,0,8,0,98,249,250,146,13,0,0,0,2,34,117,154,22,0,13,80,61,125,156,22,138,250,248,248,248,249,251,201,82,12,0,0,10,58,81,102,182,192,179,
+74,2,38,42,40,88,28,0,0,0,0,0,0,0,0,55,165,209,248,238,248,209,140,189,56,12,38,6,0,0,0,0,3,36,17,0,64,87,12,0,0,18,92,102,75,84,243,248,
+248,248,243,145,145,45,85,24,6,62,52,138,179,138,31,38,3,7,79,86,14,14,89,102,68,4,0,0,6,122,124,6,0,0,0,0,0,0,0,29,24,0,13,33,55,82,13,0,
+3,36,18,1,111,154,32,84,50,0,21,130,157,24,70,69,4,45,175,176,45,24,59,13,8,62,35,12,128,204,223,251,248,95,32,58,92,25,0,0,0,0,0,0,0,0,69,234,
+249,203,18,0,3,65,76,118,172,57,14,38,6,0,0,0,3,36,17,0,64,87,12,0,0,18,92,102,75,4,0,0,0,0,0,93,145,45,85,24,6,62,52,138,179,138,31,38,
+3,138,250,250,248,248,239,127,68,4,0,0,6,122,124,6,0,0,0,0,0,0,0,29,106,248,248,115,55,82,13,0,3,36,18,1,111,154,32,84,50,0,21,130,157,98,248,250,
+248,249,251,202,45,24,59,13,8,62,35,12,128,204,205,105,1,8,32,58,92,25,0,0,0,0,0,0,0,0,55,159,50,35,238,248,239,91,76,118,172,57,14,38,6,0,0,0,
+36,19,0,0,0,64,87,10,18,90,102,74,49,3,81,243,248,248,248,243,146,145,39,57,60,50,138,179,138,18,0,12,36,80,68,8,33,13,15,89,102,69,4,5,122,116,6,0,
+0,0,0,0,0,0,0,1,33,24,0,25,112,71,82,15,33,18,0,0,0,115,185,66,0,0,0,23,124,149,25,64,83,173,176,47,0,0,25,59,60,34,0,74,181,202,146,150,
+249,249,116,84,52,13,0,0,0,0,0,0,0,67,234,249,203,18,0,3,70,70,1,28,125,173,58,14,38,6,0,3,36,19,0,0,0,64,87,10,18,90,102,74,49,3,0,0,
+0,0,0,0,95,145,39,57,60,50,138,179,138,18,0,12,36,80,167,248,249,248,248,239,127,69,4,5,122,116,6,0,0,0,0,0,0,0,0,91,249,249,94,25,112,71,82,15,
+33,18,0,0,0,115,185,66,0,0,0,23,165,250,249,250,250,253,219,47,0,0,25,59,60,34,0,74,181,202,146,89,46,30,40,84,52,13,0,0,0,0,0,0,0,53,159,50,
+18,198,248,239,250,214,19,28,125,173,58,14,38,6,0,3,19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,81,243,248,248,248,243,146,147,76,81,143,179,138,18,0,0,7,
+83,88,7,0,3,36,13,15,89,102,73,125,122,1,0,0,0,0,0,0,0,0,0,0,1,33,24,93,183,150,66,88,24,0,0,0,12,82,134,154,22,0,0,0,4,88,145,71,
+172,176,48,0,0,0,7,65,70,12,74,178,178,81,78,102,153,250,250,106,0,36,19,0,0,0,0,0,59,231,249,203,18,0,3,70,71,3,0,0,29,124,173,58,14,36,9,34,
+19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,0,0,0,0,0,0,95,147,76,81,143,179,138,18,0,0,7,83,88,7,135,248,249,248,248,239,127,73,125,122,1,0,0,
+0,0,0,0,0,0,90,248,248,115,24,93,183,150,66,88,24,0,0,0,12,82,134,154,22,0,0,81,243,250,252,250,252,253,249,90,0,0,7,65,70,12,74,178,178,81,78,102,
+94,63,83,26,0,36,19,0,0,0,0,0,44,148,48,18,198,248,203,95,214,248,198,18,29,124,173,58,14,36,9,34,0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0,
+81,243,248,248,248,243,169,150,151,197,144,18,0,0,9,82,68,16,36,6,0,3,36,13,15,92,176,160,10,0,0,0,0,0,0,0,0,0,0,0,0,1,33,46,140,183,159,65,
+75,13,0,13,84,49,2,111,156,22,0,0,0,0,113,209,173,81,64,2,0,10,58,33,28,118,182,178,74,0,18,88,102,158,250,248,90,3,36,19,0,0,0,68,231,249,203,18,
+0,3,70,70,3,0,0,0,0,29,118,168,59,14,58,21,0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0,0,0,0,0,0,10,128,150,151,197,144,18,0,0,9,82,
+68,16,36,6,130,248,249,248,248,239,190,160,10,0,0,0,0,0,0,0,0,90,248,248,94,1,33,46,140,183,159,65,75,13,0,13,84,49,2,111,156,22,81,243,248,248,251,253,
+199,145,250,248,90,10,58,33,28,118,182,178,74,0,18,88,102,102,58,0,0,3,36,19,0,0,0,53,148,40,18,198,248,203,83,70,21,198,248,198,18,29,118,168,59,14,58,21,
+6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5,1,81,243,248,248,250,246,192,179,152,73,12,0,9,82,71,3,0,14,38,7,0,3,36,18,131,170,106,70,5,0,0,
+0,0,0,0,0,0,0,0,0,0,1,32,41,153,187,147,62,78,26,80,50,0,0,3,112,156,22,0,0,45,169,190,154,23,69,67,15,59,35,0,74,188,197,82,0,10,29,51,
+102,102,149,249,248,90,3,36,19,0,69,234,249,203,18,0,3,70,69,1,0,0,0,0,0,0,9,73,168,82,28,34,6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5,
+1,0,0,0,10,62,48,162,179,152,73,12,0,9,82,71,3,0,14,38,7,130,248,249,248,252,246,132,70,5,0,0,0,0,0,0,90,248,248,94,0,0,1,32,41,153,187,147,
+62,78,26,80,50,0,0,3,112,187,244,248,248,249,251,211,154,23,138,250,248,128,35,0,74,188,197,82,0,10,29,51,102,102,88,44,4,0,3,36,19,0,55,159,48,18,198,248,
+203,83,69,1,0,18,198,248,198,18,9,73,168,82,28,34,38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32,2,0,81,243,250,250,252,251,190,134,46,59,20,79,71,2,
+0,0,0,14,38,6,0,8,142,131,20,88,102,70,5,0,0,0,2,43,14,0,0,0,0,0,0,1,54,54,142,182,144,69,102,54,0,0,0,0,3,112,156,20,43,175,175,62,
+85,148,23,70,96,36,0,53,179,178,97,60,20,30,38,85,36,76,102,151,249,248,90,3,36,83,234,249,203,18,0,6,70,68,3,41,14,0,0,0,0,0,0,1,90,172,60,15,
+38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32,2,0,0,10,62,52,138,179,159,134,46,59,20,79,71,2,0,0,0,14,38,6,130,248,252,252,248,239,129,70,5,0,
+0,0,2,118,248,248,94,0,0,0,0,1,54,54,142,182,144,69,102,54,0,0,0,0,83,248,252,249,249,251,201,62,85,148,23,138,251,249,90,53,179,178,97,60,20,30,38,85,
+36,76,102,90,44,2,0,3,36,70,159,50,18,198,248,204,83,68,3,41,14,0,18,198,248,198,18,1,90,172,60,15,14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4,
+0,0,10,123,246,252,253,252,244,143,143,51,99,72,1,0,0,0,0,0,14,38,11,123,126,41,13,15,88,102,70,6,0,3,50,50,6,0,0,0,0,0,2,34,20,29,42,145,
+186,174,84,76,12,0,0,0,0,3,105,160,174,173,62,0,0,88,152,74,82,66,2,15,124,79,0,37,68,44,85,30,0,10,79,102,151,249,248,90,71,237,249,203,18,0,0,46,
+68,2,47,51,6,0,0,0,0,0,2,34,20,69,168,60,14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4,0,0,10,62,52,138,179,139,25,92,143,51,99,72,1,0,
+0,0,0,0,14,38,11,190,252,249,248,248,238,129,70,6,0,3,122,249,248,94,0,0,0,0,2,34,20,29,42,145,186,174,84,76,12,0,0,81,243,248,250,253,251,199,62,0,
+0,88,152,74,146,250,248,100,124,79,0,37,68,44,85,30,0,10,79,102,90,43,2,0,57,173,65,18,198,248,203,60,68,2,47,51,6,0,0,18,198,248,198,50,20,69,168,60,
+61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0,0,10,62,52,175,251,252,249,249,243,151,176,93,56,10,0,0,0,0,0,0,19,143,127,6,3,36,9,16,88,102,70,
+11,47,50,2,0,0,0,0,0,2,35,21,0,1,30,48,178,195,142,63,82,13,0,0,0,0,43,193,209,76,0,0,0,10,129,163,25,69,69,4,33,8,8,29,57,102,38,0,
+0,0,10,79,102,151,249,249,241,249,210,32,0,0,0,6,3,48,50,2,0,0,0,0,0,2,35,21,0,1,71,167,61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0,
+0,10,62,52,138,179,138,22,36,7,102,176,93,56,10,0,0,0,0,0,0,19,143,127,129,248,249,248,248,238,132,70,11,120,249,248,94,0,0,0,0,2,35,21,0,1,30,48,
+178,195,142,63,82,13,81,243,248,248,249,252,224,76,0,0,0,10,129,163,25,138,250,248,111,8,8,29,57,102,38,0,0,0,10,79,102,90,44,57,159,52,51,201,248,203,18,6,
+3,48,50,2,0,0,0,0,18,198,249,203,18,1,71,167,168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0,10,62,52,138,179,175,244,248,248,249,247,177,144,50,58,4,
+0,0,0,0,5,123,131,43,6,0,2,7,0,16,86,102,88,48,1,0,0,0,0,0,2,35,20,0,0,0,12,86,74,147,183,143,63,82,13,0,0,46,174,170,133,151,22,0,
+10,62,37,88,148,24,70,68,9,38,36,37,83,56,51,4,0,0,0,10,79,102,179,252,249,219,20,7,0,0,0,1,49,50,2,0,0,0,0,0,2,35,20,0,0,0,1,71,
+168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0,10,62,52,138,179,138,18,0,8,37,81,152,218,64,58,4,0,0,0,0,5,123,131,43,6,126,248,248,248,248,238,132,
+147,249,248,94,0,0,0,0,2,35,20,0,0,0,12,86,74,147,183,143,63,137,244,248,248,249,251,197,133,151,22,0,10,62,37,88,148,24,138,250,248,115,36,37,83,56,51,4,
+0,0,0,10,79,102,126,175,52,18,198,248,203,18,0,1,49,50,2,0,0,0,0,0,2,51,202,248,198,18,1,71,70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23,
+58,52,138,179,138,18,81,243,248,250,250,243,148,142,31,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,18,98,102,70,5,0,0,0,0,2,36,20,0,0,0,13,84,48,
+28,45,148,183,141,63,82,13,44,175,176,60,4,110,154,30,62,37,0,0,88,148,24,68,69,36,56,88,28,0,16,2,0,0,0,0,10,127,242,251,249,248,90,0,0,0,2,50,
+50,2,0,0,0,0,0,2,36,20,0,0,0,0,0,1,70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23,58,52,138,179,138,18,0,0,8,81,88,175,251,230,47,2,
+0,0,0,5,123,124,6,15,38,6,126,248,248,248,248,243,251,250,97,0,0,0,0,2,36,20,0,0,0,13,84,48,28,45,148,183,178,246,250,248,249,251,202,60,4,110,154,30,
+62,37,0,0,88,148,24,137,250,249,126,88,28,0,16,2,0,0,0,0,10,117,197,123,58,198,248,203,18,0,2,50,50,2,0,0,0,0,0,2,36,20,18,198,248,198,18,1,
+1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102,58,138,179,138,18,0,0,87,247,250,248,249,243,148,141,17,0,0,5,123,124,6,0,0,15,38,6,0,0,2,45,54,
+85,102,72,6,0,0,3,36,20,0,0,0,13,84,48,0,0,33,46,150,183,140,57,89,174,176,62,0,0,1,112,175,55,0,0,0,0,88,148,32,83,77,80,54,7,0,0,0,
+0,0,0,0,69,235,251,224,158,249,248,90,0,2,50,50,2,0,0,0,0,0,3,36,20,0,0,0,0,0,0,0,1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102,
+58,138,179,138,18,0,0,9,82,69,13,52,200,251,230,33,0,0,5,123,124,6,0,0,15,38,6,126,248,248,249,250,250,177,72,6,0,0,3,36,20,0,0,0,13,84,48,0,
+0,33,46,183,251,252,250,250,251,202,62,0,0,1,112,175,55,0,0,0,0,88,148,32,146,250,250,125,7,0,0,0,0,0,0,0,55,163,113,113,218,249,203,18,0,2,50,50,
+2,0,0,0,0,0,3,36,20,0,0,18,198,248,198,18,18,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82,174,183,138,18,0,0,8,82,129,243,248,248,249,243,149,142,
+14,1,123,124,6,0,0,0,0,15,38,4,1,50,50,0,15,86,102,72,5,0,35,19,0,0,0,13,84,56,9,0,0,1,33,47,151,182,151,170,174,66,0,0,0,9,60,112,
+148,22,0,0,0,0,94,161,58,102,75,8,36,11,0,0,0,0,0,69,234,249,205,91,102,151,249,248,91,50,50,2,0,0,0,0,0,3,35,19,0,0,0,0,0,6,13,0,
+0,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82,174,190,146,18,0,0,8,82,71,3,0,10,54,200,251,230,31,1,123,124,6,0,0,0,0,15,38,4,127,249,249,248,
+248,238,132,72,5,0,35,19,0,0,0,13,84,56,9,0,0,1,103,245,252,253,253,251,200,66,0,0,0,9,60,112,148,22,0,0,0,0,94,161,58,158,250,248,114,11,0,0,
+0,0,0,55,159,50,27,216,251,221,58,1,1,50,50,2,0,0,0,0,0,3,35,19,0,0,0,0,18,199,248,198,198,18,1,69,166,65,11,47,36,2,0,0,10,62,52,138,
+194,177,30,0,0,9,81,71,2,81,243,248,248,249,243,148,130,119,119,6,0,0,0,0,0,0,14,33,48,49,2,0,0,16,86,102,72,35,16,0,0,0,13,84,48,9,60,20,
+0,0,1,32,42,162,209,201,87,75,12,0,11,62,37,0,88,148,22,0,0,10,30,113,184,50,64,67,9,37,11,0,0,0,69,234,249,203,18,10,79,102,151,249,249,122,2,0,
+0,0,0,0,3,36,18,0,0,0,0,0,0,14,62,20,0,0,1,69,166,65,11,47,36,2,0,0,10,62,52,138,200,244,205,18,0,9,81,71,2,0,0,0,10,54,200,251,
+227,128,119,6,0,0,0,0,0,0,14,33,121,249,248,248,248,248,238,134,72,35,16,0,0,0,13,84,48,9,60,20,0,81,243,249,249,252,253,218,87,75,12,0,11,62,37,0,
+88,148,22,0,0,10,30,113,184,50,135,250,248,114,11,0,0,0,55,159,50,18,198,248,219,113,90,41,45,49,2,0,0,0,0,0,3,36,18,0,0,0,0,0,0,31,212,248,
+248,198,18,1,69,165,75,41,36,5,0,7,60,52,138,179,138,65,84,11,7,82,71,2,0,0,81,243,248,248,249,243,190,179,20,0,0,0,0,0,0,0,0,54,65,6,0,0,
+0,0,14,85,102,78,4,0,0,13,84,50,0,0,22,60,16,0,0,0,61,175,207,197,131,59,81,20,56,37,0,0,0,88,148,22,10,33,38,88,108,148,24,70,67,9,37,11,
+0,69,234,249,203,18,0,0,10,78,102,155,250,248,90,0,0,0,0,3,36,19,0,0,0,0,0,0,0,0,23,64,20,0,0,1,69,165,75,41,36,5,0,7,60,52,138,179,
+146,212,250,200,24,82,71,2,0,0,0,0,0,9,54,200,252,238,36,0,0,0,0,0,0,0,0,125,250,248,169,248,248,248,248,238,134,78,4,0,0,13,84,50,0,0,22,60,
+92,243,248,248,250,251,222,197,131,59,81,20,56,37,0,0,0,88,148,22,10,33,38,88,108,148,24,138,250,248,114,11,0,55,159,50,18,198,248,203,27,78,102,96,65,3,0,0,
+0,0,0,3,36,19,0,0,0,0,0,0,0,0,39,212,212,248,198,18,0,76,176,66,13,38,6,4,38,138,179,138,18,0,48,79,78,68,2,0,0,0,0,81,243,248,248,252,
+249,146,137,15,0,0,0,0,0,2,50,48,16,35,4,0,0,0,0,42,88,102,72,4,11,84,50,0,0,0,0,19,59,18,0,45,174,172,95,154,183,134,58,87,33,0,0,0,
+0,0,88,152,53,38,88,30,0,88,148,24,70,67,9,37,77,234,249,203,18,0,0,0,0,12,93,102,150,249,248,90,0,0,3,36,19,0,0,0,0,0,0,0,0,0,0,23,
+64,19,0,0,0,76,176,66,13,38,6,4,38,138,179,138,18,18,209,250,216,81,2,0,0,0,0,0,0,0,14,149,225,251,229,32,0,0,0,0,0,2,122,249,248,116,4,122,
+248,248,248,249,238,134,72,4,11,84,50,0,0,0,0,94,246,248,248,249,251,198,95,154,183,134,58,87,33,0,0,0,0,0,88,152,53,38,88,30,0,88,148,24,138,250,248,114,
+64,159,50,18,198,248,203,18,0,12,93,102,88,42,2,0,0,0,3,36,19,0,0,0,0,0,0,0,0,0,0,40,40,212,248,198,35,33,65,166,66,14,38,23,138,179,138,18,
+0,0,6,94,102,15,0,0,0,0,0,0,81,243,252,252,249,243,150,140,15,0,0,0,2,49,50,2,0,35,74,6,0,3,36,15,14,86,102,74,78,48,0,0,0,0,0,0,
+23,56,57,175,176,60,27,52,157,183,132,58,80,13,0,0,0,0,10,110,164,102,30,0,0,0,88,148,24,70,68,75,237,249,203,18,0,0,0,0,2,46,51,77,102,151,249,248,
+90,3,36,19,0,0,0,0,0,0,0,0,0,0,0,0,24,64,18,0,18,33,65,166,66,14,38,23,138,179,138,18,0,0,24,219,251,201,18,0,0,0,0,0,0,5,123,129,
+58,200,251,230,32,0,0,0,2,122,249,248,94,35,74,6,122,248,249,248,248,238,134,74,78,48,0,0,0,0,81,243,249,250,250,251,202,60,27,52,157,183,132,58,80,13,0,0,
+0,0,10,110,164,102,30,0,0,0,88,148,24,138,250,249,201,59,18,198,248,203,18,0,2,46,51,77,102,91,43,2,0,3,36,19,0,0,0,0,0,0,0,0,0,0,0,0,
+0,41,212,225,55,2,0,67,166,62,29,156,181,138,18,0,0,9,82,66,48,82,13,0,0,0,0,0,5,165,249,248,248,249,243,150,140,15,0,2,52,50,1,0,0,6,71,76,
+10,33,19,0,0,12,84,102,87,4,0,0,0,0,0,0,0,60,176,176,60,0,0,33,53,157,183,131,58,82,13,0,0,10,34,38,146,161,22,0,0,0,0,88,148,21,116,240,
+249,211,28,0,0,0,0,2,50,50,25,121,88,102,151,249,248,112,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,60,31,32,2,0,67,166,62,29,156,181,138,18,0,
+0,9,82,79,209,250,201,18,0,0,0,0,5,123,124,6,9,54,200,251,229,32,0,2,124,249,248,94,0,6,71,76,10,136,248,248,248,248,241,134,87,4,0,0,0,81,243,248,
+248,250,251,202,60,0,0,33,53,157,183,131,58,82,13,0,0,10,34,38,146,161,22,0,0,0,0,88,148,21,162,253,249,124,200,248,203,18,0,2,50,50,25,121,88,102,91,42,
+5,34,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,94,18,0,0,1,62,154,150,183,156,24,0,0,9,82,71,2,0,50,84,13,0,0,0,5,123,124,85,243,
+248,248,249,243,151,140,17,46,82,67,2,0,0,0,2,70,90,19,0,0,0,10,80,92,102,73,7,0,0,0,0,0,45,174,176,87,15,0,0,1,33,54,159,183,130,57,82,12,
+7,34,38,88,30,88,148,22,0,0,0,0,81,160,231,251,217,26,37,12,0,0,2,50,50,24,148,91,13,79,102,150,250,248,90,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,36,75,18,0,0,1,62,154,150,183,156,24,0,0,9,82,71,2,18,209,250,201,18,0,0,5,123,124,6,0,0,9,54,200,251,229,34,120,250,250,95,0,0,0,2,70,
+90,19,118,248,248,248,250,242,134,73,7,0,81,243,248,248,249,251,202,87,15,0,0,1,33,54,159,183,130,57,82,12,7,34,38,88,30,88,148,22,0,0,0,0,81,152,150,158,
+250,248,249,205,18,0,2,50,50,24,148,91,13,79,102,90,59,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8,
+82,71,2,0,0,0,51,84,13,0,5,123,124,6,0,81,243,248,248,249,243,151,162,61,9,68,70,3,0,0,2,32,76,74,5,0,13,84,47,15,85,102,74,7,0,0,0,42,
+172,176,59,24,62,16,0,0,1,33,56,160,183,128,56,83,40,36,88,30,0,0,88,148,22,0,0,0,63,237,252,207,83,68,10,38,10,1,50,50,24,148,88,0,0,10,78,102,
+152,249,248,90,0,0,0,0,0,0,0,0,0,0,0,0,0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8,82,71,2,0,0,18,209,250,201,18,5,123,124,6,0,0,
+0,0,9,54,200,251,241,250,248,137,70,3,0,0,2,32,76,74,5,118,248,250,249,248,241,134,74,86,243,248,248,249,251,202,59,24,62,16,0,0,1,33,56,160,183,128,56,83,
+40,36,88,30,0,0,88,148,22,0,0,0,48,174,151,35,227,250,248,125,10,1,50,50,24,148,88,0,0,10,78,102,92,40,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80,70,2,0,0,6,32,0,49,84,17,123,124,6,0,0,0,81,243,248,248,249,245,171,140,15,3,70,70,2,1,36,17,
+1,70,73,21,82,50,0,0,14,84,102,74,7,0,46,172,173,62,0,0,27,64,16,0,0,1,33,58,161,182,131,76,86,83,28,0,6,33,4,88,148,22,0,69,233,249,219,156,
+26,46,4,6,34,52,48,24,148,88,0,0,0,0,38,83,102,152,249,248,90,0,0,0,0,0,0,0,0,0,0,0,19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80,
+70,2,0,0,6,32,18,209,250,202,132,124,6,0,0,0,0,0,0,8,50,224,252,252,113,3,70,70,2,1,36,17,1,70,73,21,162,249,248,248,248,241,173,247,248,248,249,251,
+200,62,0,0,27,64,16,0,0,1,33,58,161,182,131,76,86,83,28,0,6,33,4,88,148,22,0,55,157,46,93,231,249,226,248,248,112,52,48,24,148,88,0,0,0,0,38,83,
+102,91,42,2,0,0,0,0,0,0,0,0,0,0,0,0,36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88,6,0,0,6,38,15,0,0,55,167,130,6,0,0,0,0,
+0,81,243,248,249,250,243,153,139,14,3,69,68,33,18,0,0,1,70,102,49,0,0,0,0,14,84,102,71,50,175,174,59,0,0,0,0,28,63,18,0,0,1,33,57,166,191,97,
+95,86,8,3,38,15,0,0,88,136,82,232,249,203,18,88,148,22,0,1,49,65,32,148,88,0,0,0,3,36,16,9,79,102,152,249,248,90,0,0,0,0,0,0,0,0,0,18,
+36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88,6,0,0,6,38,15,0,18,210,253,228,23,0,0,0,0,0,0,0,1,122,250,248,251,229,31,3,69,68,33,18,0,
+0,1,70,102,49,113,248,248,248,248,250,251,250,249,251,200,59,0,0,0,0,28,63,18,0,0,1,33,57,166,191,97,95,86,8,3,38,15,0,0,88,136,69,151,50,18,198,250,
+233,39,94,248,249,132,32,148,88,0,0,0,3,36,16,9,79,102,91,42,2,0,0,0,0,0,0,0,0,0,0,18,3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15,
+33,4,4,35,14,0,0,5,123,149,82,11,0,0,0,0,0,0,83,245,249,248,249,243,153,138,14,3,81,68,2,0,0,10,70,81,63,5,0,0,0,0,13,80,99,173,173,58,
+0,0,0,0,0,0,29,32,0,0,0,1,33,80,103,85,50,49,77,40,12,0,0,0,0,124,238,250,203,18,0,0,88,148,24,44,47,31,163,94,0,0,0,2,33,18,0,0,
+9,75,96,148,249,248,90,0,0,0,0,0,0,0,15,35,3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15,33,4,4,35,14,0,0,5,132,232,250,200,18,0,0,0,
+0,0,3,119,249,248,126,200,251,229,31,3,81,68,2,0,0,10,70,81,63,5,113,248,248,248,248,250,251,251,200,58,0,0,0,0,0,0,29,32,0,0,0,1,33,80,103,85,
+50,49,77,40,12,0,0,0,0,114,179,65,18,198,248,203,100,148,24,122,249,249,195,94,0,0,0,2,33,18,0,0,9,75,96,85,39,2,0,0,0,0,0,0,0,0,15,35,
+0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71,10,36,36,10,0,0,5,123,124,6,43,81,12,0,0,0,0,3,48,111,243,248,248,249,243,153,140,46,17,60,67,0,
+11,81,43,2,62,74,5,0,0,0,0,51,173,173,89,8,0,0,0,0,0,0,0,0,0,0,0,9,30,52,90,22,7,35,62,79,12,0,0,0,68,230,251,231,39,0,0,0,
+0,90,168,60,21,148,92,37,11,0,3,35,16,0,0,0,0,9,74,96,147,249,248,90,0,0,0,0,0,18,34,2,0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71,
+10,36,36,10,0,0,5,123,124,23,208,250,201,18,0,0,0,3,121,249,248,94,6,52,201,251,229,61,17,60,67,0,11,81,43,2,62,74,5,157,248,248,248,249,253,211,89,8,
+0,0,0,0,0,0,0,0,0,0,0,9,30,52,90,22,7,35,62,79,12,0,0,0,53,143,112,146,203,248,203,18,0,90,168,60,108,252,250,114,11,0,3,35,16,0,0,0,
+0,9,74,96,85,41,1,0,0,0,0,0,0,18,34,2,0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164,73,42,43,4,0,5,123,124,6,0,0,49,84,12,0,0,
+1,47,50,2,81,243,248,248,249,244,166,147,13,3,66,69,77,48,0,0,3,70,78,8,0,0,46,175,176,98,102,74,6,0,0,0,0,0,0,0,0,0,10,34,38,84,52,17,
+4,42,40,54,82,13,0,69,234,249,203,100,148,22,0,0,1,47,117,141,140,83,0,8,37,14,33,19,0,0,0,0,0,0,10,79,102,151,249,248,90,0,0,0,19,36,3,0,
+0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164,73,42,43,4,0,5,123,124,6,0,18,209,250,201,18,0,1,120,249,248,94,0,0,6,53,201,251,231,30,3,66,69,
+77,48,0,0,3,70,134,243,248,248,249,253,253,246,134,74,6,0,0,0,0,0,0,0,0,0,10,34,38,84,52,17,4,42,40,54,82,13,0,55,159,49,18,218,252,208,18,0,
+1,47,117,141,140,147,248,248,114,14,33,19,0,0,0,0,0,0,10,79,102,90,44,2,0,0,0,0,19,36,3,0,0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64,
+174,78,12,38,11,123,124,6,0,0,0,0,58,86,12,0,1,22,4,0,0,81,244,248,248,250,244,153,140,25,15,102,87,0,0,0,0,2,70,64,3,45,175,176,60,17,82,96,
+70,8,0,0,0,0,0,0,0,10,34,38,88,30,0,33,49,9,10,33,55,82,79,234,249,203,18,0,95,149,22,0,1,22,22,168,168,18,0,0,8,58,26,0,0,0,0,0,
+0,0,0,10,79,102,151,249,248,90,0,19,36,3,0,0,0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64,174,78,12,38,11,123,124,6,0,0,0,18,211,250,201,18,
+90,248,248,94,0,0,24,3,6,72,204,251,230,41,15,102,87,0,0,0,0,83,246,250,248,249,253,253,250,248,244,132,70,8,0,0,0,0,0,0,0,10,34,38,88,30,0,33,
+49,9,10,33,55,82,65,159,50,18,198,248,223,157,22,0,1,22,22,168,168,18,94,248,248,128,26,0,0,0,0,0,0,0,0,10,79,102,90,43,2,0,0,19,36,3,0,0,
+52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34,69,163,69,18,141,127,6,0,0,0,0,0,11,78,84,12,0,0,0,0,0,1,123,246,249,248,249,243,151,156,97,48,
+64,69,3,0,0,0,0,16,66,174,176,62,0,0,11,78,96,76,8,0,0,0,0,0,10,34,38,88,30,0,6,34,39,21,0,13,33,109,241,249,203,18,16,40,17,111,149,23,
+0,23,147,81,81,147,22,3,34,23,34,12,0,0,0,0,0,0,0,0,10,79,102,151,249,248,101,36,3,0,0,11,52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34,
+69,163,69,18,141,127,6,0,0,0,0,0,28,216,250,218,248,248,94,0,0,1,62,69,31,21,50,201,251,233,109,48,64,69,3,0,81,243,248,248,250,251,224,250,248,248,248,244,
+132,76,8,0,0,0,0,0,10,34,38,88,30,0,6,34,39,21,0,13,33,98,190,61,18,198,248,211,34,111,149,23,0,23,147,81,81,147,22,96,249,249,112,12,0,0,0,0,
+0,0,0,0,10,79,102,90,43,1,18,36,3,0,0,11,38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13,0,61,151,140,122,42,6,0,0,0,0,0,0,13,78,84,
+12,0,0,0,0,0,5,140,247,248,248,249,244,177,169,22,2,70,70,3,0,0,0,43,175,176,63,0,0,0,7,59,83,102,76,8,0,0,0,10,34,38,88,30,0,6,38,13,
+0,33,24,0,78,237,250,220,28,11,85,50,0,18,108,152,54,141,88,0,0,88,149,55,19,0,8,39,13,0,0,0,0,0,0,0,0,10,79,102,150,249,249,92,0,0,10,62,
+38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13,0,61,151,140,122,42,6,0,0,0,0,0,0,30,228,250,248,105,0,0,0,0,5,86,76,0,7,50,204,252,236,39,
+2,70,70,83,243,248,248,249,251,202,63,108,248,248,248,250,244,137,76,8,0,0,0,10,34,38,88,30,0,6,38,13,0,33,24,0,65,171,94,94,200,248,220,65,0,18,108,152,
+54,141,88,0,0,88,149,55,106,248,248,115,13,0,0,0,0,0,0,0,0,10,79,102,89,50,32,2,0,0,10,62,0,0,0,1,0,0,9,82,71,2,0,0,6,38,14,0,
+0,1,142,186,72,14,35,6,0,0,0,0,0,0,13,78,84,12,0,0,0,3,34,19,127,246,248,248,251,246,141,148,22,3,70,71,6,0,46,175,176,66,31,6,0,10,62,35,
+13,82,102,77,9,0,10,33,38,88,30,0,6,38,14,0,0,1,33,86,234,249,209,67,79,80,47,0,0,0,43,157,186,95,0,0,0,3,112,156,22,0,0,7,39,13,0,0,
+0,0,0,4,6,0,10,77,109,186,249,248,90,10,62,37,0,0,0,1,0,0,9,82,71,2,0,0,32,183,31,0,0,1,142,186,72,14,35,6,0,0,0,0,0,90,248,250,
+250,201,18,0,0,3,34,19,67,70,0,16,110,210,233,160,22,3,129,246,248,248,249,251,202,66,31,6,108,248,250,249,248,244,137,77,9,0,10,33,38,88,30,0,6,38,14,0,
+0,1,33,73,159,60,46,210,250,219,62,0,0,0,43,157,186,95,0,0,0,3,112,156,22,94,248,248,115,13,0,0,0,0,0,4,6,0,10,77,109,146,49,2,0,10,62,37,
+0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,116,69,161,74,13,38,6,0,0,0,0,0,0,13,78,84,12,0,3,36,19,0,3,126,246,250,249,249,243,141,
+148,22,3,70,75,51,175,176,62,0,13,34,16,60,37,0,79,128,92,102,76,19,30,38,88,30,0,6,38,14,0,0,0,0,69,237,249,203,26,41,94,94,10,0,0,30,101,156,
+143,137,22,0,3,36,19,88,148,22,0,0,7,39,13,0,0,0,0,7,38,10,0,25,95,176,201,249,248,129,37,0,0,0,0,0,0,9,82,71,2,0,0,6,183,248,198,18,
+5,123,116,69,161,74,13,38,6,0,0,0,90,248,248,113,216,250,201,18,3,36,19,0,3,66,69,75,51,48,38,88,148,96,243,250,250,249,251,202,62,0,13,34,16,140,249,248,
+250,252,245,140,76,19,30,38,88,30,0,6,38,14,0,0,0,0,56,171,69,18,200,249,222,106,10,0,0,30,101,156,143,137,22,0,3,36,19,88,148,22,94,248,248,115,13,0,
+0,0,0,7,38,10,45,25,95,176,169,45,14,60,37,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,124,6,1,61,165,74,14,38,6,0,0,0,0,0,0,
+13,78,84,16,32,19,0,0,0,15,151,247,248,248,249,244,141,148,23,0,85,176,176,60,0,0,0,20,73,38,0,74,178,179,63,80,102,87,44,84,30,0,6,38,14,0,0,0,
+0,69,234,249,210,36,11,85,67,53,81,11,27,105,161,87,19,111,149,24,36,19,0,0,88,148,22,0,0,7,38,13,0,0,0,0,10,35,24,29,15,82,175,200,250,249,90,0,
+0,0,0,0,9,82,71,2,0,0,6,38,31,198,248,199,132,124,6,1,61,165,74,14,38,6,0,90,248,248,94,0,30,216,250,202,47,19,0,0,0,15,102,87,0,5,38,13,
+141,250,249,248,250,251,202,60,0,0,0,20,73,38,104,250,253,253,249,244,140,87,44,84,30,0,6,38,14,0,0,0,0,55,159,51,48,202,248,220,80,53,81,11,27,105,161,87,
+19,111,149,24,36,19,0,0,88,148,22,94,248,248,115,13,0,0,0,0,10,112,249,137,15,82,175,168,74,35,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,
+124,6,0,0,0,60,159,75,14,38,5,0,22,2,0,0,0,12,75,96,27,0,0,0,13,82,48,124,246,248,248,249,244,141,145,69,168,176,75,7,0,0,10,59,43,32,78,178,
+178,74,0,20,90,102,101,36,0,6,38,14,0,0,0,0,69,234,249,203,18,39,90,47,11,32,52,84,103,160,88,0,0,18,110,162,38,0,0,0,0,88,148,22,0,0,7,38,
+12,0,0,0,0,28,57,10,0,8,83,175,201,249,248,90,0,0,0,9,82,71,2,0,0,6,38,14,0,18,199,252,226,23,0,0,0,60,159,75,14,38,93,248,249,96,0,0,
+0,29,215,251,204,18,0,0,13,82,48,64,69,2,6,107,244,250,252,250,251,201,75,7,0,0,10,59,43,32,78,209,253,250,248,248,245,140,101,36,0,6,38,14,0,0,0,0,
+55,159,50,18,198,249,221,62,11,32,52,84,103,160,88,0,0,18,110,162,38,0,0,0,0,88,148,22,94,248,248,114,12,0,0,0,90,249,250,100,0,8,83,175,170,45,2,0,
+27,0,9,82,71,2,0,0,6,38,14,0,0,5,123,126,14,0,0,0,0,0,33,154,76,14,32,44,53,4,0,0,0,1,38,81,82,12,0,13,84,50,0,2,129,246,248,248,
+249,243,157,209,175,52,9,37,8,9,62,37,0,84,190,180,74,0,10,29,46,102,102,73,16,34,14,0,0,0,0,72,235,249,203,18,12,83,50,0,0,10,50,113,189,96,0,0,
+0,1,45,118,148,22,0,0,0,0,88,148,22,0,0,12,41,12,0,0,24,30,11,38,8,6,60,91,175,201,249,248,90,0,9,82,71,2,0,0,6,38,14,0,0,5,132,226,
+248,198,18,0,0,0,33,154,76,99,249,249,128,4,0,0,0,1,53,216,250,201,18,13,84,50,0,2,70,70,82,243,249,248,251,253,200,52,9,37,8,9,62,37,0,84,190,180,
+148,248,248,249,249,245,140,73,16,34,14,0,0,0,0,58,162,50,18,198,248,220,65,0,0,10,50,113,189,96,0,0,0,1,45,118,148,22,0,0,0,0,88,148,22,94,248,248,
+116,12,0,90,249,249,101,38,8,6,60,91,175,169,62,172,176,8,82,70,2,0,0,6,38,14,0,0,5,123,124,21,61,15,0,36,72,9,0,30,154,77,49,69,10,0,0,0,
+3,36,15,10,78,81,26,80,50,0,0,0,3,129,246,248,248,250,251,211,160,20,0,8,38,61,35,0,74,178,182,100,2,9,33,38,84,39,76,102,90,20,0,0,0,0,69,235,
+251,206,18,13,83,50,0,0,0,24,111,178,124,81,13,0,3,36,16,16,111,149,22,0,0,0,0,86,141,16,0,43,76,39,10,21,33,1,0,8,38,61,32,11,82,175,201,249,
+248,95,82,70,2,0,0,6,38,14,0,0,5,123,124,37,212,248,198,51,72,9,0,30,190,250,249,138,10,0,0,0,3,36,15,28,216,250,204,93,50,0,0,0,3,129,246,248,
+248,250,251,211,160,20,0,8,38,61,35,0,74,178,182,100,2,110,249,249,250,249,244,143,90,20,0,0,0,0,55,165,99,32,198,248,220,65,0,0,0,24,111,178,124,81,13,0,
+3,36,16,16,111,149,22,0,0,0,0,86,141,16,94,249,250,115,96,248,249,94,0,8,38,61,32,11,82,181,235,249,65,77,69,2,0,0,6,38,14,0,0,5,123,124,6,0,
+30,63,16,72,102,78,8,0,30,171,115,17,35,6,0,3,36,19,0,0,10,77,102,68,37,0,0,0,0,3,128,246,249,253,253,246,139,148,22,8,61,56,7,74,178,178,74,10,
+38,33,37,88,30,0,16,92,102,77,10,0,0,69,234,249,209,76,21,76,88,16,0,0,0,80,174,98,31,55,81,17,32,19,0,0,19,112,149,22,0,0,0,0,76,136,22,6,
+67,73,48,36,0,0,0,8,61,56,7,0,10,82,175,200,249,250,134,2,0,0,6,38,14,0,0,5,123,124,6,0,46,212,248,214,113,78,8,90,249,252,166,17,35,6,0,3,
+36,19,0,0,27,215,251,213,52,0,0,0,81,243,250,250,249,251,200,64,86,148,22,8,61,56,7,74,178,178,74,10,38,33,122,250,249,248,248,245,143,77,10,0,0,55,159,48,
+46,212,248,219,100,16,0,0,0,80,174,98,31,55,81,17,32,19,0,0,19,112,149,22,0,0,0,0,76,136,22,98,250,250,249,249,94,0,0,8,61,56,7,0,27,216,253,238,
+175,87,4,0,0,6,38,14,0,0,5,123,124,6,0,0,0,28,57,56,90,102,75,11,43,77,155,79,14,36,9,34,19,0,0,0,10,81,88,104,159,53,0,0,0,0,0,139,
+251,253,250,249,244,141,152,79,35,9,101,181,178,74,0,6,37,56,86,29,0,6,34,23,78,102,78,10,69,234,249,203,18,27,62,73,43,5,0,0,64,170,90,0,13,32,55,95,
+28,0,0,0,0,19,112,149,22,0,0,0,0,85,147,22,1,76,85,37,12,0,10,62,35,9,38,10,0,10,80,175,205,250,248,90,0,6,38,14,0,0,5,123,124,6,0,0,
+0,44,211,250,218,113,138,248,249,143,155,79,14,36,9,34,19,0,0,0,10,94,218,251,233,67,0,81,243,248,248,250,251,200,57,31,14,88,152,79,35,9,101,181,178,74,0,6,
+37,56,86,117,248,248,249,249,244,143,78,10,55,159,48,18,198,249,216,86,43,5,0,0,64,170,90,0,13,32,55,95,28,0,0,0,0,19,112,149,22,0,0,0,0,85,147,22,
+150,250,250,165,12,0,10,62,35,9,38,27,198,248,219,181,175,168,46,1,5,38,14,0,0,5,123,124,6,0,0,0,0,1,59,73,30,76,102,88,53,3,29,152,79,14,58,21,
+0,0,0,13,84,48,12,77,120,162,52,0,0,0,45,172,201,247,248,248,249,243,169,163,23,69,181,190,81,0,11,34,34,90,55,1,5,38,14,0,11,80,102,126,235,249,203,18,
+0,1,59,74,17,0,1,64,171,91,0,0,0,13,52,68,81,13,0,0,0,0,19,112,149,22,0,0,0,0,88,148,42,30,66,76,23,9,62,37,0,0,10,39,10,0,19,105,
+175,200,249,248,93,38,14,0,0,5,123,124,6,0,0,0,0,1,73,214,249,228,251,250,127,3,29,152,79,14,58,21,0,0,0,13,84,48,30,215,251,234,126,243,248,248,249,251,
+201,90,0,4,22,11,128,163,23,69,181,190,81,0,11,34,34,90,55,1,102,249,248,248,248,244,143,117,163,48,18,198,248,203,73,74,17,0,1,64,171,91,0,0,0,13,52,68,
+81,13,0,0,0,0,19,112,149,22,0,0,0,0,88,186,249,249,250,250,105,9,62,37,0,0,27,207,248,203,36,105,80,175,169,47,32,12,0,0,5,123,124,6,0,0,0,0,
+3,50,44,28,54,28,89,102,73,5,0,29,153,100,28,32,6,0,13,84,50,0,0,13,77,119,162,53,0,46,175,175,56,125,246,248,248,250,245,136,156,173,175,81,35,16,30,33,
+84,28,8,36,36,11,0,0,0,10,127,242,251,205,18,0,3,50,44,28,59,16,58,170,91,0,0,0,3,31,27,30,55,82,13,0,0,0,0,19,110,149,22,0,0,0,0,102,
+162,22,2,66,68,55,35,0,0,0,0,10,33,16,76,68,80,175,201,249,249,98,0,0,5,123,124,6,0,0,0,0,3,50,44,44,224,249,250,165,73,5,0,29,153,100,28,32,
+6,0,13,84,50,0,0,30,215,251,252,249,248,249,251,201,56,64,69,0,6,59,36,81,156,173,175,81,35,16,30,33,84,28,8,36,36,106,248,248,248,248,247,213,114,27,198,248,
+204,64,44,28,59,16,58,170,91,0,0,0,3,31,27,30,55,82,13,0,0,0,0,19,110,149,22,0,0,0,90,250,252,108,96,250,250,126,35,0,0,18,198,248,210,33,76,68,
+9,82,175,171,49,17,24,5,123,124,6,0,0,0,0,4,52,46,1,0,26,69,52,80,102,72,5,0,61,160,80,13,34,20,83,50,0,0,0,0,12,77,118,158,83,169,175,55,
+0,2,127,246,250,249,248,247,203,179,86,0,16,52,40,81,25,0,6,42,38,20,23,0,0,69,235,251,218,24,0,4,52,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12,
+32,55,82,13,0,0,0,0,18,111,149,22,0,0,24,31,88,148,22,12,96,82,1,0,0,0,0,0,14,93,72,0,9,82,175,202,249,248,105,5,123,124,6,0,0,0,0,4,
+52,46,1,90,249,250,250,216,113,72,5,0,61,160,80,13,34,20,83,50,0,0,0,0,100,249,251,252,250,251,201,55,0,2,67,70,55,33,0,69,179,179,86,0,16,52,40,81,
+25,0,6,42,38,20,109,248,248,249,252,246,135,200,248,204,66,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12,32,55,82,13,0,0,0,0,18,111,149,22,0,90,249,249,
+150,148,22,102,251,250,90,0,18,198,248,203,31,93,72,0,0,10,83,175,169,61,7,123,124,6,0,0,0,0,4,53,48,2,0,2,44,59,52,28,81,102,70,34,17,28,152,81,
+18,94,52,0,0,0,0,0,0,12,73,133,208,182,52,0,0,0,12,147,247,248,250,253,251,165,135,32,31,42,99,35,0,0,14,9,26,58,8,0,69,234,249,205,22,0,4,53,
+48,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0,13,33,55,82,13,0,0,0,0,19,112,150,28,24,33,1,0,88,152,76,36,66,69,3,0,0,0,9,80,72,36,9,
+0,10,83,175,201,250,248,169,124,6,0,0,0,0,4,53,48,2,90,248,249,140,210,249,216,113,70,34,17,28,152,81,18,94,52,0,0,0,0,81,243,248,250,252,253,205,52,0,
+0,0,12,96,83,1,74,178,173,123,135,32,31,42,99,35,0,0,14,9,26,58,8,94,249,252,249,248,246,248,204,67,48,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0,
+13,33,55,82,13,0,0,0,0,19,112,150,108,249,249,94,0,88,152,76,117,250,250,104,198,248,203,26,80,72,36,9,10,0,8,87,173,163,138,122,6,0,0,0,0,4,54,47,
+1,0,2,49,51,3,25,59,30,82,102,75,2,0,28,152,82,32,35,6,0,0,0,0,0,0,68,184,170,168,50,0,0,10,60,36,125,249,253,253,250,243,146,162,57,86,37,30,
+7,0,0,17,33,16,36,73,234,249,203,18,0,4,54,47,1,0,2,66,170,90,25,64,16,1,36,19,0,0,0,0,0,13,33,55,82,13,0,0,0,0,18,109,88,32,1,0,
+0,10,129,164,22,2,70,72,114,95,14,82,70,1,8,39,10,0,8,87,173,197,252,252,94,0,0,0,0,4,54,47,1,90,248,249,126,3,42,211,249,216,113,75,2,0,28,152,
+82,32,35,6,0,0,81,243,248,248,250,252,197,168,50,0,0,10,60,36,65,123,179,178,72,0,94,162,57,86,37,30,7,0,0,17,33,16,36,60,194,249,248,248,248,246,121,47,
+1,0,2,66,170,90,25,64,16,1,36,19,0,0,0,0,0,13,33,55,82,13,0,0,0,0,18,161,250,249,94,0,0,10,129,164,22,96,250,250,251,223,31,82,70,1,8,39,
+39,8,13,38,84,205,201,51,2,0,0,0,5,54,46,1,0,4,49,51,3,0,0,26,57,48,86,102,68,4,0,27,152,82,14,38,6,0,0,0,0,60,190,154,87,113,162,52,
+10,62,37,0,75,216,252,250,248,248,245,158,185,50,0,7,37,8,17,36,3,0,79,237,249,203,18,0,5,54,46,1,0,4,67,170,90,0,0,26,61,42,15,0,0,0,0,0,
+0,0,13,33,55,82,13,0,0,0,0,35,55,2,0,0,10,62,37,88,148,20,3,150,199,169,94,70,2,0,0,10,39,8,13,38,84,205,221,249,248,90,0,0,5,54,46,1,
+90,248,249,126,3,0,0,42,211,249,217,113,68,4,0,27,152,82,14,38,6,81,243,248,248,250,252,187,87,113,162,52,10,62,37,0,75,199,199,76,0,10,33,113,185,50,0,7,
+37,8,17,36,3,0,66,173,53,105,248,248,248,250,242,72,0,4,67,170,90,0,0,26,61,42,15,0,0,0,0,0,0,0,13,33,55,82,13,0,0,0,90,249,250,95,0,0,
+10,62,37,88,148,37,217,252,253,204,94,70,2,0,0,10,8,46,38,5,124,158,170,167,47,3,0,5,54,46,0,0,0,43,51,3,0,0,0,0,48,62,32,83,102,67,4,27,
+43,151,83,14,38,6,0,0,60,190,155,50,14,77,117,167,98,37,0,74,189,185,164,246,248,249,249,247,155,148,22,0,7,46,38,2,0,69,234,249,211,24,0,5,54,46,0,0,
+0,61,170,90,0,0,0,0,48,66,15,0,0,0,0,1,55,6,0,13,33,55,82,13,0,0,24,29,17,35,1,9,62,37,0,0,111,145,117,179,187,124,66,1,0,0,0,0,
+8,46,38,5,124,158,170,199,249,248,90,5,54,46,0,90,248,249,126,3,0,0,0,0,63,212,249,216,113,67,4,0,27,151,83,14,107,243,248,248,250,252,187,50,14,77,117,167,
+98,37,0,74,189,185,121,67,14,31,38,88,108,148,22,0,7,46,38,2,0,55,159,59,53,200,248,248,250,249,248,243,72,61,170,90,0,0,0,0,48,66,15,0,0,0,0,1,
+55,6,0,13,33,55,82,13,0,90,249,249,105,35,1,9,62,37,0,0,120,230,252,245,253,251,133,1,0,0,0,0,17,38,40,128,124,12,80,176,169,46,9,54,45,0,0,0,
+0,14,4,0,0,0,3,36,15,24,59,34,85,102,86,221,198,42,151,84,14,37,4,59,190,155,52,0,0,10,75,133,173,48,69,178,185,118,21,128,247,249,250,249,243,141,148,22,
+16,38,36,10,69,234,249,203,31,35,12,54,45,0,0,0,22,154,91,0,0,0,3,36,15,24,64,18,0,0,0,83,179,110,3,0,13,33,55,100,209,86,33,1,0,16,36,58,
+36,0,0,0,24,173,185,160,101,93,65,2,0,0,0,0,17,38,40,128,124,12,80,176,201,249,248,125,45,0,90,248,248,103,4,0,0,0,3,36,15,41,211,249,217,113,66,3,
+0,26,151,138,244,249,248,250,252,187,52,0,0,10,75,133,173,48,69,178,185,118,21,69,82,40,86,30,0,88,148,22,16,38,36,10,55,159,48,18,201,249,205,134,249,248,248,248,
+244,182,91,0,0,0,3,36,15,24,64,18,0,0,0,83,179,110,3,0,13,33,55,82,98,248,249,94,0,16,36,58,36,0,0,18,203,253,241,166,158,250,250,91,0,0,0,0,
+36,6,127,142,10,0,10,82,175,168,71,41,0,0,0,0,0,0,0,0,0,3,33,19,0,0,27,59,35,86,113,212,248,198,42,151,84,10,79,190,155,52,0,0,0,8,58,83,
+112,166,176,173,73,20,61,43,133,248,249,248,248,243,141,154,52,1,9,95,234,249,198,18,0,16,69,44,0,0,0,22,148,88,0,0,0,3,33,19,0,0,27,64,18,0,0,48,
+164,185,117,3,0,13,56,225,250,241,72,0,0,8,64,54,0,0,0,5,114,185,189,180,77,10,68,70,3,0,0,19,36,6,127,142,10,0,10,82,175,200,250,249,90,90,248,248,
+94,0,0,0,0,3,33,19,0,0,43,211,249,217,113,64,2,0,99,250,250,248,251,252,187,52,0,0,0,8,58,83,112,166,176,173,73,20,61,43,77,102,31,0,0,0,88,154,
+52,1,9,83,161,48,18,198,248,206,82,44,90,248,248,249,252,247,72,0,0,3,33,19,0,0,27,64,18,0,0,48,164,185,117,3,0,13,33,125,250,249,94,0,0,8,64,54,
+0,0,18,199,251,239,193,180,77,100,250,250,92,0,0,19,8,123,124,9,2,0,0,10,84,175,172,45,2,0,0,0,0,0,0,0,3,36,18,0,0,0,0,26,59,36,86,113,
+212,248,198,41,142,119,183,154,54,0,0,0,10,62,34,12,125,201,183,104,0,7,44,71,82,131,246,248,248,248,244,156,148,20,66,234,249,198,18,0,8,53,49,32,6,0,22,148,
+88,0,0,0,3,36,18,0,0,0,0,26,64,18,0,0,41,179,204,117,3,5,219,249,251,253,244,69,10,62,34,15,35,3,6,116,179,162,108,146,157,22,3,70,70,2,17,36,
+8,123,124,9,2,0,0,10,84,175,202,249,248,248,248,94,0,0,0,0,3,36,18,0,0,0,0,42,211,249,217,113,63,82,243,249,252,252,251,187,54,0,0,0,10,62,34,12,
+125,201,183,104,0,7,44,71,82,74,64,3,0,0,19,111,148,20,51,160,49,18,198,248,205,68,49,32,6,90,249,252,250,248,243,77,3,36,18,0,0,0,0,26,64,18,0,0,
+41,179,204,117,3,0,97,249,251,202,74,1,10,62,34,15,35,3,33,236,238,169,108,146,157,22,96,250,250,91,17,36,123,124,6,0,0,0,0,0,37,95,175,169,48,3,0,0,
+0,0,0,3,36,19,0,0,0,0,0,0,26,59,38,87,113,212,248,198,91,209,181,58,30,6,0,10,62,37,0,74,182,199,155,147,56,33,38,90,72,21,126,246,248,248,248,243,
+136,160,231,249,198,18,0,0,38,45,0,13,38,28,148,88,0,0,0,3,36,19,0,0,0,0,0,0,26,64,18,0,0,41,180,204,117,4,95,246,252,253,253,241,103,37,0,0,
+19,41,119,179,162,107,66,22,128,157,22,3,69,70,21,7,123,124,6,0,0,0,0,0,37,95,175,220,249,248,150,0,0,0,0,3,36,19,0,0,0,0,0,0,42,211,249,218,
+158,246,248,248,250,253,205,58,30,6,0,10,62,37,0,74,182,199,155,147,56,33,38,90,72,21,66,70,3,0,21,3,81,153,148,44,18,198,248,203,53,45,0,13,38,28,186,247,
+248,248,248,243,102,19,0,0,0,0,0,0,26,64,18,0,0,41,180,204,117,49,248,250,191,195,169,27,58,37,0,0,19,41,119,187,168,107,66,22,128,157,22,96,250,250,104,7,
+124,6,0,0,0,0,0,0,1,14,82,175,170,48,4,0,0,0,3,36,19,0,0,0,0,0,0,0,0,26,58,39,88,113,211,250,240,167,160,85,13,34,16,60,37,0,74,178,
+178,82,76,118,173,82,87,28,18,61,22,126,246,248,248,248,245,242,252,202,18,0,0,0,4,0,0,0,35,164,92,0,0,0,3,36,19,0,0,0,0,0,0,0,0,26,64,18,
+0,0,41,180,203,125,57,179,251,252,250,251,242,54,0,0,7,129,189,163,104,70,2,0,22,130,157,22,3,70,72,124,124,6,0,0,0,0,0,0,1,14,144,253,253,249,248,90,
+0,0,3,36,19,0,0,0,0,0,0,0,0,42,211,249,250,251,250,250,251,190,160,85,13,34,16,60,37,0,74,178,178,82,76,118,173,82,87,28,18,61,22,66,70,3,0,0,
+50,174,150,33,198,248,203,18,4,0,0,0,35,164,92,90,243,248,248,249,244,77,0,0,0,0,0,0,0,26,64,18,0,0,41,180,203,125,155,182,183,152,74,102,43,0,0,0,
+7,129,189,163,104,70,2,0,22,130,157,22,96,250,250,170,96,0,0,0,0,0,0,0,0,0,10,85,159,132,41,6,0,3,36,19,0,0,0,0,0,0,0,0,0,0,25,58,
+40,86,125,241,252,210,40,150,87,20,73,38,0,74,178,178,74,0,19,83,122,189,73,0,0,22,61,22,126,246,248,249,252,249,227,156,22,0,0,0,0,0,0,22,148,97,38,6,
+0,3,36,19,0,0,0,0,0,0,0,0,0,0,26,64,19,0,0,40,181,207,170,179,177,245,250,250,250,240,54,8,121,179,165,114,69,2,0,0,0,22,130,157,20,4,159,160,
+9,0,0,0,0,0,0,0,0,90,248,250,195,177,249,248,90,3,36,19,0,0,0,0,0,0,0,0,0,0,109,249,249,250,251,252,186,52,24,150,87,20,73,38,0,74,178,178,
+74,0,19,83,122,189,73,0,0,22,61,22,66,70,3,55,157,44,93,231,249,203,18,0,0,0,0,22,148,97,38,6,90,243,249,248,248,243,77,0,0,0,0,0,0,0,26,64,
+19,0,0,40,181,207,170,179,134,34,66,70,78,13,0,8,121,179,165,114,69,2,0,0,0,22,130,157,20,97,253,253,250,92,0,0,0,0,0,0,0,0,0,8,9,122,130,41,
+9,34,19,0,0,0,0,0,0,0,0,0,0,0,0,25,53,84,191,162,216,248,198,40,154,114,43,32,78,178,178,74,0,10,30,46,102,121,161,52,0,0,22,61,22,126,248,252,
+249,248,243,141,148,22,0,0,0,0,22,148,88,0,14,36,9,34,19,0,0,0,0,0,0,0,0,0,0,0,0,25,64,19,0,23,79,193,204,168,28,128,249,249,250,250,236,149,
+179,160,101,75,32,2,0,0,0,0,22,128,145,121,120,74,70,3,0,0,0,0,0,0,90,248,248,99,9,122,176,249,248,112,19,0,0,0,0,0,0,0,0,0,0,81,243,249,
+250,251,253,191,81,0,0,24,154,114,43,32,78,178,178,74,0,10,30,46,102,121,161,52,0,0,22,61,22,66,109,160,48,18,198,250,233,39,0,0,0,0,22,148,88,0,14,36,
+9,112,244,248,248,248,243,77,0,0,0,0,0,0,0,25,64,19,0,23,79,193,204,168,28,59,42,30,55,82,21,121,179,160,101,75,32,2,0,0,0,0,22,128,145,121,177,250,
+250,250,92,0,0,0,0,0,0,0,0,0,0,5,122,129,62,21,0,0,0,0,0,0,0,0,0,0,0,16,3,0,74,191,153,96,113,211,248,200,92,64,0,84,190,180,74,0,
+10,34,39,83,40,74,119,162,52,0,0,22,61,85,243,251,248,248,248,243,141,148,22,0,0,22,148,88,0,0,0,14,58,21,0,0,0,0,0,0,0,0,0,0,0,16,4,0,
+25,60,35,48,139,179,192,203,145,37,90,248,249,250,253,248,178,104,70,1,16,36,3,0,0,0,0,22,178,185,27,3,70,70,3,0,0,0,0,90,248,248,94,0,0,5,122,176,
+250,248,90,0,0,0,0,0,0,0,0,0,81,244,248,248,250,253,252,219,113,56,0,9,79,64,0,84,190,180,74,0,10,34,39,83,40,74,119,162,52,0,0,22,61,72,183,102,
+19,198,248,203,100,148,22,0,0,22,148,88,0,0,0,14,58,21,86,243,248,248,248,243,81,0,0,0,0,16,4,0,25,60,35,48,139,179,192,203,145,37,0,12,33,62,166,182,
+158,104,70,1,16,36,3,0,0,0,0,22,178,185,27,154,96,250,250,92,0,0,0,0,0,0,0,0,0,0,8,139,136,38,6,0,0,0,0,0,0,0,11,16,0,18,30,62,
+189,155,78,45,91,113,211,250,206,18,74,177,182,101,4,8,34,39,87,30,0,13,78,120,163,51,0,0,85,239,249,223,246,248,248,248,243,141,147,18,18,147,88,0,0,0,3,32,
+28,34,6,0,0,0,0,0,0,0,11,16,0,19,36,3,0,38,90,154,179,127,59,191,207,120,5,94,248,251,253,253,240,104,2,0,0,19,36,5,0,0,5,120,125,128,154,22,
+3,70,70,3,0,0,90,248,248,94,0,0,0,0,8,139,180,249,248,90,0,0,0,0,0,0,11,92,243,248,249,250,252,191,216,249,218,113,59,55,36,0,74,177,182,101,4,8,
+34,39,87,30,0,13,78,120,163,51,0,0,71,182,66,72,212,248,203,18,0,88,147,18,18,147,88,0,0,0,3,32,28,34,6,86,243,248,248,248,243,81,11,16,0,19,36,3,
+0,38,90,154,179,127,59,191,207,120,5,0,19,139,195,185,99,67,2,0,0,19,36,5,0,0,5,120,125,128,154,22,19,96,250,250,92,0,0,0,0,0,0,0,0,3,36,24,
+118,117,43,6,0,0,0,0,0,0,5,36,18,0,68,184,153,49,22,57,46,92,113,214,248,212,172,165,71,12,40,34,38,87,30,0,0,0,12,66,116,153,38,56,232,249,212,38,
+126,246,248,248,248,243,138,135,135,84,0,0,0,3,36,19,0,14,38,6,0,0,0,0,0,0,5,36,19,0,18,32,24,46,149,190,135,21,61,65,171,197,111,16,165,252,252,251,
+251,232,45,0,0,0,19,21,0,6,109,120,4,22,128,146,19,3,70,70,3,90,248,248,94,0,0,0,0,3,36,24,118,168,249,248,90,0,0,0,0,0,85,245,248,248,250,252,
+185,49,38,211,249,218,113,72,0,66,165,165,71,12,40,34,38,87,30,0,0,0,12,66,116,153,38,41,149,64,76,203,250,217,21,0,0,0,84,135,135,84,0,0,0,3,36,19,
+0,14,38,6,86,243,248,248,248,243,81,36,19,0,18,32,24,46,149,190,135,21,61,65,171,197,111,16,108,162,160,109,102,15,0,0,0,0,19,21,0,6,109,120,4,22,128,146,
+152,21,96,250,250,92,0,0,0,0,0,0,3,36,19,0,6,109,125,42,6,0,0,0,0,0,0,3,29,70,186,148,68,0,0,22,56,69,96,113,222,253,235,79,0,8,39,57,
+85,28,0,0,0,0,0,0,50,109,164,232,249,198,38,59,18,126,246,248,248,248,244,184,150,21,0,5,110,71,19,0,0,0,14,38,6,0,0,0,0,0,0,3,36,18,0,35,
+74,142,168,133,69,62,34,0,34,169,195,161,154,183,251,250,250,250,231,41,0,0,0,0,5,118,111,6,0,0,22,121,152,21,3,70,135,248,248,94,0,0,0,0,3,36,19,0,
+6,109,172,249,248,90,0,0,0,81,243,248,249,250,252,181,68,0,0,38,210,250,219,113,109,165,165,66,0,8,39,57,85,28,0,0,0,0,0,0,50,109,157,151,34,18,203,250,
+207,80,70,3,0,0,21,150,150,21,0,5,110,71,19,0,0,0,14,38,6,86,243,248,248,221,27,3,36,18,0,35,74,142,168,133,69,62,34,0,34,169,195,161,154,135,98,81,
+54,80,13,0,0,0,0,0,5,118,111,6,0,0,22,121,128,157,22,96,250,250,92,0,0,0,0,3,36,19,0,0,0,5,125,130,42,6,0,0,0,0,0,0,61,191,154,49,
+14,34,2,7,63,66,48,140,212,241,250,198,27,33,41,88,55,2,0,0,0,0,0,0,0,102,241,252,209,18,0,18,57,21,126,246,248,249,252,247,136,144,34,119,142,31,0,0,
+0,0,0,14,38,6,0,0,0,0,0,0,3,32,35,49,157,189,129,19,63,70,18,0,0,48,191,202,172,97,151,248,249,250,250,231,41,0,0,5,123,123,6,0,0,0,0,22,
+128,157,22,92,250,250,96,0,0,0,0,3,36,19,0,0,0,5,125,176,249,248,90,0,81,243,248,248,250,252,186,49,14,34,2,7,76,213,249,229,212,193,74,0,10,33,41,88,
+55,2,0,0,0,0,0,0,0,90,191,164,62,198,248,207,71,21,66,70,3,27,147,81,81,144,34,119,142,31,0,0,0,0,0,14,38,6,81,243,221,27,0,0,3,32,35,49,
+157,189,129,19,63,70,18,0,0,48,191,202,172,97,69,16,31,56,83,11,0,0,0,5,123,123,6,0,0,0,0,22,22,130,157,22,96,250,250,92,0,0,3,36,19,0,0,0,
+3,69,65,122,129,42,6,0,0,15,14,59,190,155,68,14,0,14,19,60,33,21,115,193,206,154,209,248,205,55,88,23,10,38,5,4,9,0,0,0,69,233,250,225,168,52,0,0,
+21,61,22,126,246,252,251,248,243,139,180,141,20,0,0,0,0,0,0,0,14,38,6,0,0,22,56,6,0,23,76,157,179,135,30,60,33,22,64,20,13,124,179,193,202,149,9,113,
+248,249,250,250,223,41,5,123,124,6,0,0,0,0,0,0,22,130,192,249,248,138,70,3,0,0,3,36,19,0,0,0,3,69,65,122,175,249,248,141,243,248,248,250,252,187,68,14,
+0,14,19,60,33,38,223,253,244,154,49,10,32,40,88,23,10,38,5,4,9,0,0,0,55,158,83,127,234,249,203,18,21,61,22,66,70,118,91,0,0,85,180,141,20,0,0,0,
+0,0,0,0,14,38,6,77,27,22,56,6,0,23,76,157,179,135,30,60,33,22,64,20,13,124,179,193,202,149,9,0,13,35,59,81,17,0,5,123,124,6,0,0,0,0,0,0,
+0,22,130,157,22,96,250,250,91,1,36,19,0,0,0,3,70,71,5,5,122,129,39,6,0,2,79,191,155,52,3,34,16,7,61,37,0,74,185,196,111,94,113,212,249,218,45,0,
+0,13,37,37,9,10,23,69,234,249,198,65,120,163,52,0,0,22,61,22,126,247,248,248,248,249,191,144,20,0,0,0,0,0,0,0,0,14,35,3,9,80,102,54,18,55,153,189,
+135,17,61,37,0,0,24,74,142,179,145,116,183,194,122,6,118,248,249,250,250,225,149,124,6,0,0,0,0,0,0,0,0,63,251,252,108,3,70,70,2,1,36,19,0,0,0,3,
+70,71,5,5,122,175,249,248,248,248,251,252,187,52,3,34,16,7,61,37,0,74,190,242,251,219,113,65,39,87,29,0,0,13,37,37,9,10,23,55,159,48,18,209,251,236,66,0,
+0,22,61,22,66,81,3,0,4,115,162,144,20,0,0,0,0,0,0,0,0,14,35,3,9,80,102,54,18,55,153,189,135,17,61,37,0,0,24,74,142,179,145,116,183,194,122,6,
+0,11,34,70,82,27,132,124,6,0,0,0,0,0,0,0,0,0,22,130,157,22,96,250,250,112,17,0,0,0,3,70,70,3,0,0,5,122,129,42,4,60,190,155,60,0,0,1,
+36,65,36,0,74,178,178,90,56,56,96,111,219,249,198,18,0,4,44,40,13,37,77,234,249,198,18,0,51,119,163,52,0,0,22,61,22,126,246,248,252,252,245,139,148,22,0,0,
+0,0,0,0,0,0,10,40,79,102,77,54,65,153,179,127,45,65,36,0,0,0,15,144,197,157,92,76,39,170,204,124,6,124,249,249,250,253,240,36,0,0,0,0,0,0,0,0,
+0,0,137,176,157,22,3,69,68,33,17,0,0,0,3,70,70,3,0,0,5,165,250,249,248,250,252,187,60,0,0,1,36,65,36,0,74,178,178,102,211,250,220,111,93,26,0,0,
+0,4,44,40,13,37,64,159,48,18,198,248,213,128,163,52,0,0,22,61,22,66,70,7,123,141,26,85,148,22,0,0,0,0,0,0,0,0,10,40,79,102,77,54,65,153,179,127,
+45,65,36,0,0,0,15,144,197,157,92,76,39,170,204,124,6,4,42,37,61,173,135,6,0,0,0,0,0,0,0,0,0,0,0,22,130,157,22,96,250,250,90,0,0,3,70,71,
+4,0,0,0,0,5,122,122,88,188,155,52,28,18,0,10,60,37,0,79,178,178,74,0,28,64,73,102,112,208,248,198,24,38,11,19,61,78,234,249,198,18,0,0,0,51,119,163,
+52,0,0,22,61,22,128,251,252,248,248,243,141,148,22,0,1,0,0,0,0,0,8,82,102,78,31,53,167,185,124,19,60,37,0,0,0,15,134,179,156,112,80,4,0,35,178,204,
+128,39,132,248,253,253,250,223,27,0,0,0,0,0,4,0,0,0,0,22,130,157,22,4,86,76,1,0,0,3,70,71,4,0,0,0,81,243,252,252,251,253,210,52,28,18,0,10,
+60,37,0,79,178,178,74,0,44,212,250,221,112,43,0,0,6,38,11,19,61,65,159,48,18,198,248,203,18,51,119,163,52,0,0,22,61,22,69,159,141,23,0,0,88,148,22,0,
+1,0,0,0,0,0,8,82,102,78,31,53,167,185,124,19,60,37,0,0,0,15,134,179,156,112,80,4,0,35,178,204,128,39,12,23,151,154,85,13,0,0,0,0,0,0,4,0,
+0,0,0,0,22,129,158,48,106,250,250,91,1,70,70,4,44,22,0,0,0,0,1,142,209,153,54,0,2,32,24,58,37,0,79,202,187,74,0,10,29,52,100,70,94,113,208,248,
+206,31,0,24,85,237,249,198,18,0,0,0,0,0,62,118,161,52,0,0,22,64,136,194,247,248,248,248,243,141,148,24,46,22,0,0,0,10,79,102,80,51,56,154,180,139,34,58,
+37,0,0,0,15,135,179,148,91,80,60,19,0,0,34,177,208,129,20,194,252,249,250,250,223,27,0,0,0,1,30,19,0,0,0,0,22,129,158,48,19,67,70,1,1,70,70,4,
+44,22,0,81,243,248,248,252,253,252,250,90,2,32,24,58,37,0,79,202,187,74,0,10,29,66,220,250,219,113,44,1,34,14,0,24,72,172,53,18,198,248,203,18,0,0,62,118,
+161,52,0,0,22,64,136,166,80,2,0,0,0,88,148,24,46,22,0,0,0,10,79,102,80,51,56,154,180,139,34,58,37,0,0,0,15,135,179,148,91,80,60,19,0,0,34,177,
+208,129,20,132,135,36,55,82,13,0,0,0,0,1,30,19,19,0,0,0,0,22,137,162,22,96,250,250,132,69,3,0,24,64,20,0,0,0,59,183,190,144,34,6,0,11,72,44,
+0,74,178,188,138,28,6,33,40,84,46,54,58,99,113,208,248,198,18,71,234,249,207,24,0,0,0,0,0,0,1,58,114,162,53,0,5,135,161,37,125,246,248,248,248,243,141,148,
+44,64,20,0,10,79,102,76,31,63,169,181,121,19,72,44,0,0,0,17,136,179,146,94,76,4,20,64,23,0,0,34,177,203,166,116,136,248,249,250,250,219,27,0,0,0,4,36,
+19,0,0,0,0,22,137,162,22,3,68,65,65,69,3,0,24,64,94,243,248,248,250,251,211,185,249,248,90,11,72,44,0,74,178,188,138,28,6,33,40,84,60,210,250,220,113,46,
+3,0,0,57,159,60,54,199,248,203,18,0,0,0,1,58,114,162,53,0,5,135,161,37,64,62,1,0,0,0,88,148,44,64,20,0,10,79,102,76,31,63,169,181,121,19,72,44,
+0,0,0,17,136,179,146,94,76,4,20,64,23,0,0,34,177,203,166,116,3,14,34,55,82,13,0,0,0,0,4,36,36,19,0,0,3,30,34,127,157,22,97,251,251,93,0,0,
+0,23,64,18,0,60,191,154,58,121,129,39,16,59,36,30,87,178,178,74,28,89,52,38,96,111,22,22,49,42,100,112,207,248,214,235,249,198,31,38,6,0,0,0,0,0,0,0,
+62,120,158,53,115,140,39,58,26,95,243,248,248,248,243,141,148,43,60,28,77,102,78,33,58,157,183,139,24,59,36,30,18,0,25,138,179,144,93,75,5,0,0,23,55,5,0,0,
+39,194,204,124,5,135,248,249,250,250,214,27,0,0,0,3,36,19,0,0,3,30,34,127,157,22,5,98,98,5,0,0,0,97,246,248,248,250,252,185,58,121,175,249,248,128,36,30,
+87,178,178,74,28,89,52,38,96,111,22,39,209,249,220,112,42,2,57,159,48,18,201,249,204,18,0,0,0,0,0,0,62,120,158,53,115,140,39,58,26,21,0,0,0,0,0,88,
+148,43,60,28,77,102,78,33,58,157,183,139,24,59,36,30,18,0,25,138,179,144,93,75,5,0,0,23,55,5,0,0,39,194,204,124,5,0,14,33,55,82,13,0,0,0,0,3,
+3,36,18,1,36,19,0,22,128,158,81,136,250,250,92,0,0,0,24,56,71,190,155,50,0,5,122,133,77,38,0,76,189,184,74,0,6,52,91,90,109,179,139,18,4,0,39,102,
+108,216,252,249,202,18,0,14,38,6,0,0,0,0,0,0,0,65,120,184,150,19,0,22,63,18,81,243,248,248,248,243,141,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2,
+36,19,93,179,144,93,74,4,0,0,0,0,4,0,0,5,115,125,171,204,126,7,140,248,249,250,250,209,27,0,0,0,3,36,18,1,36,19,0,22,128,158,81,66,65,68,3,0,
+81,243,249,250,250,252,187,50,0,5,122,178,250,249,90,76,189,184,74,0,6,52,91,90,109,179,139,18,21,198,249,221,108,67,159,48,18,198,248,206,53,6,0,0,0,0,0,0,
+0,65,120,184,150,19,0,22,63,18,0,0,0,0,0,0,88,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2,36,19,93,179,144,93,74,4,0,0,0,0,4,0,0,5,
+115,125,171,204,126,7,0,13,33,55,82,13,0,0,0,0,0,2,34,45,15,0,0,0,22,152,180,22,95,250,250,92,0,0,0,74,191,154,40,0,0,0,15,153,143,37,75,178,
+179,100,16,8,33,38,89,91,49,139,179,138,18,0,0,40,95,235,249,248,202,18,0,0,14,38,6,0,0,0,0,0,0,5,149,179,153,50,0,0,22,64,22,81,243,248,248,248,
+243,145,180,115,97,25,36,159,179,118,16,59,43,32,6,0,3,36,28,97,96,74,4,0,0,0,0,0,0,0,5,123,124,1,31,176,204,127,7,149,248,249,250,250,209,18,0,0,
+0,2,34,45,15,0,0,0,22,152,180,22,1,70,70,83,243,248,248,250,252,186,40,0,0,0,15,153,185,249,250,205,179,100,16,8,33,38,89,91,49,139,179,138,18,18,198,249,
+217,165,48,18,198,248,203,18,14,38,6,0,0,0,0,0,0,5,149,179,153,50,0,0,22,64,22,0,0,0,0,0,0,94,180,115,97,25,36,159,179,118,16,59,43,32,6,0,
+3,36,28,97,96,74,4,0,0,0,0,0,0,0,5,123,124,1,31,176,204,127,7,0,13,33,55,82,13,0,0,0,0,2,34,45,15,0,0,3,66,76,126,156,22,96,250,250,
+92,0,60,190,154,78,12,0,0,10,62,40,112,146,183,179,74,2,38,42,39,87,26,25,90,47,138,179,138,18,0,71,234,249,202,202,248,198,18,8,0,14,38,6,0,0,0,0,
+5,124,139,71,115,162,52,0,0,22,64,22,81,243,248,248,248,247,187,180,50,84,165,179,117,16,62,37,0,14,38,6,0,1,34,82,71,4,0,0,0,0,0,0,0,5,123,124,
+6,0,0,32,176,204,128,11,154,248,249,250,250,209,18,0,0,2,34,45,15,0,0,3,66,76,126,156,22,3,129,246,248,248,250,252,186,78,12,0,0,10,62,40,112,186,253,253,
+138,2,38,42,39,87,26,25,90,47,138,179,138,18,18,211,252,209,35,198,248,203,18,8,0,14,38,6,0,0,0,0,5,124,139,71,115,162,52,0,0,22,64,22,0,0,0,0,
+10,79,155,180,50,84,165,179,117,16,62,37,0,14,38,6,0,1,34,82,71,4,0,0,0,0,0,0,0,5,123,124,6,0,0,32,176,204,128,11,0,13,33,55,82,13,0,0,
+3,36,18,1,36,16,1,70,70,2,20,130,158,22,96,250,250,131,191,154,40,24,59,13,8,62,37,0,74,179,183,101,4,8,32,56,92,26,0,0,28,90,47,138,179,133,82,232,
+249,198,18,18,198,248,198,45,24,0,14,38,6,0,0,5,125,142,23,0,66,120,162,55,1,0,22,64,23,81,243,248,250,251,247,141,143,166,197,123,14,62,37,0,0,0,14,38,
+4,6,78,87,18,0,0,0,0,0,0,0,2,118,123,6,0,0,0,0,32,176,204,143,26,158,248,249,250,250,206,18,3,36,18,1,36,16,1,70,70,2,20,130,158,96,243,250,
+250,250,252,187,40,24,59,13,8,62,37,0,74,179,210,251,248,95,32,56,92,26,0,0,28,90,47,138,179,133,69,160,209,248,238,248,203,18,0,29,24,0,14,38,6,0,0,5,
+125,142,23,0,66,120,162,55,1,0,22,64,23,0,0,10,79,102,79,88,143,166,197,123,14,62,37,0,0,0,14,38,4,6,78,87,18,0,0,0,0,0,0,0,2,118,123,6,
+0,0,0,0,32,176,204,143,26,0,13,33,55,82,13,0,31,19,0,122,91,33,75,68,3,0,0,23,124,150,23,94,251,253,191,42,0,0,25,59,60,34,0,74,177,171,140,119,
+43,33,38,84,52,13,0,0,0,28,90,48,132,184,238,249,198,18,0,0,18,198,248,198,48,24,0,14,38,6,5,123,142,24,0,0,0,66,121,145,15,0,0,23,55,1,87,247,
+251,250,248,244,198,179,132,59,60,34,0,0,0,0,0,12,36,79,70,8,33,19,0,0,0,0,0,4,109,111,5,0,0,0,0,0,0,32,176,204,144,26,158,248,249,250,250,202,
+47,19,0,0,2,33,75,68,3,0,0,23,165,250,249,248,251,252,187,42,0,0,25,59,60,34,0,74,177,171,140,169,249,249,115,84,52,13,0,0,0,28,90,48,132,179,179,60,
+35,238,248,239,35,0,0,1,33,24,0,14,38,6,5,123,142,24,0,0,0,66,121,145,15,0,0,23,55,1,10,79,102,79,10,36,171,179,132,59,60,34,0,0,0,0,0,12,
+36,79,70,8,33,19,0,0,0,0,0,4,109,111,5,0,0,0,0,0,0,32,176,204,144,26,0,13,33,55,81,17,27,0,45,248,248,134,86,18,0,0,0,0,4,88,141,80,
+210,252,249,90,0,0,7,65,70,12,74,178,178,71,6,125,142,61,86,26,0,36,19,0,0,0,27,90,108,238,253,227,34,0,0,0,0,18,198,248,198,48,24,0,14,41,126,139,
+20,0,0,0,0,0,66,94,13,0,0,0,2,10,79,151,247,248,249,252,251,178,138,80,70,12,0,0,0,0,0,7,83,88,7,0,3,36,19,0,0,0,5,121,119,2,0,0,
+0,0,0,0,0,0,32,174,204,145,31,158,248,249,250,251,200,18,0,0,2,69,86,18,0,0,0,81,243,250,252,250,251,186,42,0,0,0,7,65,70,12,74,178,178,71,6,125,
+184,250,250,107,0,36,19,0,0,0,27,90,96,179,179,141,202,248,239,248,198,18,0,0,1,33,24,0,14,41,126,139,20,0,0,0,0,0,66,94,13,0,0,0,2,10,79,102,
+79,10,39,161,179,142,138,80,70,12,0,0,0,0,0,7,83,88,7,0,3,36,19,0,0,0,5,121,119,2,0,0,0,0,0,0,0,0,32,174,204,145,26,0,13,32,55,95,
+79,13,0,96,250,250,95,33,19,0,0,0,0,0,121,209,159,120,248,248,90,10,58,33,28,118,182,178,74,0,10,37,142,169,57,2,0,3,36,19,0,0,0,86,240,250,227,184,
+138,18,0,0,0,0,18,198,248,198,48,24,11,129,152,25,0,0,0,0,0,0,0,66,84,10,0,0,9,79,102,78,88,245,252,253,251,243,165,162,48,62,13,0,0,0,9,81,
+64,16,36,6,0,3,36,19,0,5,123,124,5,0,8,51,11,0,0,0,0,0,0,30,174,204,146,31,162,248,250,250,250,197,14,3,70,70,8,33,19,0,81,243,248,248,252,253,
+190,42,0,0,0,10,58,33,28,118,182,178,74,0,10,37,142,201,250,248,90,3,36,19,0,0,0,74,189,87,142,238,252,207,35,198,248,198,18,0,0,1,33,24,11,129,152,25,
+0,0,0,0,0,0,0,66,84,10,0,0,9,79,102,78,10,41,162,179,111,16,124,162,48,62,13,0,0,0,9,81,64,16,36,6,0,3,36,19,0,5,123,124,5,0,8,51,
+11,0,0,0,0,0,0,30,174,204,146,26,0,13,52,62,55,80,19,66,139,248,248,92,36,19,0,0,0,60,183,179,155,22,94,248,248,130,35,0,74,188,197,82,0,10,33,40,
+91,136,127,42,7,0,3,36,19,0,66,234,250,218,64,138,179,138,18,0,0,0,0,18,198,248,198,48,96,139,32,33,3,0,0,0,0,0,0,0,66,84,8,8,79,102,77,14,
+41,195,251,251,248,250,245,141,148,51,63,12,0,9,82,70,0,0,14,38,7,0,3,36,23,123,124,6,0,0,53,102,77,9,0,0,0,0,0,0,30,174,204,145,34,177,249,249,
+250,250,198,73,71,3,0,3,36,94,243,248,248,250,251,203,155,22,0,0,10,62,35,0,74,188,197,82,0,10,33,40,91,136,174,249,248,90,3,36,19,0,52,159,74,102,209,252,
+238,146,18,18,198,248,198,18,0,0,1,32,96,139,32,33,3,0,0,0,0,0,0,0,66,84,8,8,79,102,77,14,41,168,179,110,14,62,35,88,148,51,63,12,0,9,82,70,
+0,0,14,38,7,0,3,36,23,123,124,6,0,0,53,102,77,9,0,0,0,0,0,0,30,174,204,145,29,29,27,30,32,54,102,70,1,94,248,248,92,36,18,0,60,190,154,56,
+87,148,22,100,250,249,90,74,178,178,97,60,20,30,39,88,28,5,122,129,43,6,0,3,36,80,234,249,198,42,90,49,138,179,139,58,14,0,0,0,18,198,248,198,77,40,0,12,
+35,6,0,0,0,0,0,0,0,64,78,78,102,76,27,28,32,156,159,243,250,249,248,243,141,148,52,59,20,79,71,3,0,0,0,14,38,6,0,8,142,134,6,0,0,0,14,80,
+102,75,13,40,14,0,0,0,0,29,173,203,155,46,171,248,249,250,251,211,10,0,0,0,83,245,248,248,250,252,187,56,87,148,22,10,62,37,0,74,178,178,97,60,20,30,39,88,
+28,5,122,176,249,248,90,3,36,67,159,53,18,204,250,209,146,179,139,58,31,198,248,198,18,0,0,1,64,40,0,12,35,6,0,0,0,0,0,0,0,64,78,78,102,76,27,28,
+32,156,114,13,62,37,0,0,88,148,52,59,20,79,71,3,0,0,0,14,38,6,0,8,142,134,6,0,0,0,14,80,102,75,13,40,14,0,0,0,0,29,173,203,155,42,0,14,
+14,82,86,76,12,0,94,248,248,92,32,71,190,155,57,0,0,88,152,79,117,248,250,205,179,74,0,37,68,46,85,28,0,0,5,122,130,42,6,0,68,237,249,198,18,0,26,91,
+48,138,194,161,23,0,0,0,0,18,198,249,202,45,24,0,14,38,6,0,0,0,0,0,0,11,97,102,76,26,32,4,0,19,15,123,245,248,248,248,243,141,148,54,99,72,1,0,
+0,0,0,0,14,38,11,123,126,41,19,0,0,0,0,11,79,102,90,50,4,0,0,0,0,0,29,180,205,146,33,176,248,250,250,250,193,9,0,81,243,248,249,250,252,187,57,0,
+0,88,152,79,37,0,74,178,179,74,0,37,68,46,85,28,0,0,5,122,176,249,248,90,54,173,68,18,198,248,204,102,48,138,194,161,23,18,198,248,198,18,2,34,20,29,24,0,
+14,38,6,0,0,0,0,0,0,11,97,102,76,26,32,4,0,19,15,62,37,0,0,2,3,88,148,54,99,72,1,0,0,0,0,0,14,38,11,123,126,41,19,0,0,0,0,11,
+79,102,90,50,4,0,0,0,0,0,29,180,205,146,28,0,64,73,34,54,82,13,0,94,248,248,123,191,155,55,0,0,0,10,129,163,23,138,253,253,154,8,8,29,58,102,36,0,
+0,0,0,5,122,130,39,68,234,249,206,32,0,0,0,25,84,79,158,180,138,18,0,0,0,2,51,203,248,198,48,23,0,14,38,6,0,0,0,0,10,78,102,93,82,36,1,0,
+0,10,62,37,81,243,248,248,249,243,142,180,96,56,10,0,0,0,0,0,0,19,143,127,6,3,36,15,0,0,0,0,13,95,102,73,6,0,0,0,0,2,34,43,172,204,147,37,
+196,250,249,250,250,184,87,243,248,248,250,252,187,55,0,0,0,10,129,163,23,69,178,179,99,8,8,29,58,102,36,0,0,0,0,5,122,176,249,249,193,55,51,201,248,198,18,25,
+84,79,158,180,138,18,18,198,248,198,51,21,0,1,33,23,0,14,38,6,0,0,0,0,10,78,102,93,82,36,1,0,0,10,62,37,0,0,0,4,36,7,93,180,96,56,10,0,
+0,0,0,0,0,19,143,127,6,3,36,15,0,0,0,0,13,95,102,73,6,0,0,0,0,2,34,43,172,204,147,29,83,0,11,33,55,82,13,0,94,249,252,179,75,15,0,0,
+10,62,37,81,156,173,204,250,248,116,36,38,82,54,51,4,0,0,0,0,5,113,147,234,249,198,20,7,0,0,0,0,61,102,50,138,179,138,18,0,2,35,20,18,198,248,198,45,
+20,0,14,38,6,0,0,10,79,102,75,28,78,82,9,0,10,62,37,0,0,81,243,248,248,226,99,133,150,54,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,0,0,2,
+46,52,80,102,74,7,0,0,2,35,20,0,29,172,203,168,89,180,248,249,250,250,247,248,248,249,250,174,75,15,0,0,10,62,37,81,156,173,175,74,9,41,36,38,82,54,51,4,
+0,0,0,0,5,113,182,252,249,102,198,248,198,18,0,0,61,102,50,138,179,138,18,18,198,249,202,18,0,0,0,30,20,0,14,38,6,0,0,10,79,102,75,28,78,82,9,0,
+10,62,37,0,0,0,0,0,8,37,81,133,150,54,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,0,0,2,46,52,80,102,74,7,0,0,2,35,20,0,29,172,203,168,
+149,27,0,13,33,55,82,13,22,187,250,249,94,34,16,9,62,37,0,69,179,179,86,94,248,249,127,88,26,0,16,2,0,0,0,0,0,67,238,252,206,24,0,0,0,0,2,50,
+44,27,88,50,138,179,138,20,36,20,0,0,18,198,248,198,48,24,0,14,38,3,9,79,102,76,27,30,6,66,80,21,58,37,0,0,0,0,81,243,222,100,88,11,88,148,36,2,
+0,0,0,5,123,124,6,15,38,6,0,0,0,0,2,50,50,0,11,83,102,72,5,0,36,20,0,0,0,27,186,209,149,35,185,248,249,250,250,248,249,250,149,33,6,34,16,9,
+62,37,0,69,179,179,86,0,8,36,58,88,26,0,16,2,0,0,0,0,0,53,179,183,249,248,248,198,18,0,2,50,44,27,88,50,138,179,138,20,51,202,248,198,18,0,0,0,
+32,24,0,14,38,3,9,79,102,76,27,30,6,66,80,21,58,37,0,0,0,0,0,0,8,81,88,11,88,148,36,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,2,50,
+50,0,11,83,102,72,5,0,36,20,0,0,0,27,186,209,203,148,29,0,13,33,55,97,153,98,117,248,248,91,36,65,36,0,74,178,173,123,135,31,115,249,250,125,7,0,0,0,
+0,0,0,0,66,232,249,223,139,42,6,0,0,2,50,50,2,0,25,90,51,138,180,154,36,0,0,0,0,18,198,248,198,49,24,0,11,40,79,102,76,27,32,4,0,0,66,102,
+41,0,0,0,0,0,0,83,101,69,13,36,10,88,148,22,0,0,5,123,124,6,0,0,15,38,6,0,0,2,50,50,2,0,0,13,84,102,72,34,17,0,0,0,3,68,83,171,
+203,148,37,209,248,249,250,251,252,150,36,3,0,1,36,65,36,0,74,178,173,123,135,31,33,38,88,54,7,0,0,0,0,0,0,0,52,155,55,123,236,249,248,102,0,2,50,50,
+2,0,25,90,51,138,180,154,36,18,198,248,198,18,0,0,0,33,24,0,11,40,79,102,76,27,32,4,0,0,66,102,41,0,0,0,0,0,0,9,82,69,13,36,10,88,148,22,
+0,0,5,123,124,6,0,0,15,38,6,0,0,2,50,50,2,0,0,13,84,102,72,34,17,0,0,0,3,68,83,171,171,204,149,29,0,13,52,171,145,41,0,94,248,248,129,37,
+0,74,178,178,72,0,93,162,58,149,249,248,115,11,0,0,0,0,0,66,234,249,198,23,122,130,42,4,1,50,50,2,0,0,0,24,89,52,151,185,138,18,0,0,0,6,30,198,
+248,198,48,20,8,82,102,77,26,32,3,0,0,9,55,73,76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148,20,1,123,124,6,0,0,0,0,15,38,4,1,50,50,2,
+0,0,0,0,13,83,102,77,3,0,0,3,69,76,13,27,171,204,183,245,248,248,250,253,252,185,5,0,0,9,60,37,0,74,178,178,72,0,93,162,58,88,27,6,39,11,0,0,
+0,0,0,52,159,53,18,199,252,236,249,248,91,50,50,2,0,0,0,24,89,52,151,185,138,18,18,198,248,199,30,0,0,1,33,20,8,82,102,77,26,32,3,0,0,9,55,73,
+76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148,20,1,123,124,6,0,0,0,0,15,38,4,1,50,50,2,0,0,0,0,13,83,102,77,3,0,0,3,69,76,13,27,
+27,170,204,149,26,20,152,116,70,80,12,0,101,250,249,90,74,178,178,74,0,10,30,114,185,48,94,248,248,115,11,0,0,0,66,234,249,198,18,0,5,122,129,37,48,49,2,0,
+0,0,0,0,25,101,62,138,179,138,18,0,0,14,62,36,198,248,198,52,84,102,79,48,32,2,0,0,10,62,36,0,56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86,
+135,121,118,6,0,0,0,0,0,0,14,33,48,49,2,0,0,0,0,0,0,42,88,102,70,3,1,70,68,15,59,20,27,197,252,252,248,249,252,251,250,250,171,5,11,62,37,0,
+74,178,178,74,0,10,30,114,185,48,0,0,10,39,11,0,0,0,52,159,53,18,198,248,199,132,175,249,249,122,2,0,0,0,0,0,25,101,62,138,179,138,18,18,198,248,212,36,
+0,0,0,36,84,102,79,48,32,2,0,0,10,62,36,0,56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86,135,121,118,6,0,0,0,0,0,0,14,33,48,49,2,0,
+0,0,0,0,0,42,88,102,70,3,1,70,68,15,59,20,19,26,170,204,152,144,92,40,32,54,81,20,56,118,248,250,205,178,74,0,10,33,39,88,107,148,22,94,248,248,115,11,
+0,66,234,249,198,18,0,0,0,5,122,150,69,6,0,0,0,0,0,3,30,39,86,52,138,179,138,18,0,0,22,60,33,198,248,215,113,81,25,38,36,5,0,7,60,37,0,0,
+0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11,152,179,27,0,0,0,0,0,0,0,0,54,65,6,0,0,0,0,0,3,36,15,14,86,102,68,96,150,9,0,23,64,
+94,244,252,254,252,249,228,249,249,250,250,169,60,37,0,74,178,178,74,0,10,33,39,88,107,148,22,0,0,9,39,11,0,52,159,53,18,198,248,198,18,5,122,189,250,248,90,0,
+0,0,0,3,30,39,86,52,138,179,138,18,18,198,249,212,33,0,10,78,102,81,25,38,36,5,0,7,60,37,0,0,0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11,
+152,179,27,0,0,0,0,0,0,0,0,54,65,6,0,0,0,0,0,3,36,15,14,86,102,68,96,150,9,0,23,64,64,18,21,168,203,173,50,0,12,33,54,87,33,0,140,253,
+253,138,0,10,33,39,88,28,0,88,148,22,94,248,248,115,74,234,249,198,18,0,0,0,0,2,54,147,130,40,5,0,0,0,3,36,19,0,24,90,52,138,179,138,18,0,0,19,
+56,43,215,251,215,60,45,0,13,38,6,4,22,0,0,0,0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141,119,85,145,22,0,0,0,0,0,2,50,48,16,36,5,0,
+0,0,3,36,19,12,4,14,83,102,102,128,122,5,0,97,246,248,249,252,252,200,64,194,248,249,250,250,171,5,74,178,178,74,0,10,33,39,88,28,0,88,148,22,0,0,9,39,
+61,159,53,18,198,248,198,18,0,2,54,147,176,249,248,90,0,0,3,36,19,0,24,90,52,138,179,138,18,18,198,248,210,43,77,102,75,45,45,0,13,38,6,4,22,0,0,0,
+0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141,119,85,145,22,0,0,0,0,0,2,50,48,16,36,5,0,0,0,3,36,19,12,4,14,83,102,102,128,122,5,0,23,
+24,64,34,140,184,207,150,30,0,13,33,54,80,83,178,206,250,248,96,33,39,88,28,0,0,0,88,148,22,94,248,249,243,249,198,18,0,0,0,0,2,50,50,7,122,130,43,5,
+0,3,36,19,0,0,0,23,89,52,138,179,138,18,0,0,30,97,113,214,249,204,47,23,0,14,38,6,0,0,0,0,0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129,
+42,11,88,148,22,0,0,0,2,50,50,2,0,16,38,5,0,3,36,19,0,80,124,5,70,100,102,69,124,122,85,243,249,250,249,249,206,207,150,45,203,248,249,250,250,190,178,178,
+74,0,10,33,39,88,28,0,0,0,88,148,22,0,0,59,174,62,18,198,248,198,18,0,2,50,50,7,122,176,249,248,90,3,36,19,0,0,0,23,89,52,138,179,138,18,18,198,
+249,220,113,74,27,29,31,23,0,14,38,6,0,0,0,0,0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129,42,11,88,148,22,0,0,0,2,50,50,2,0,16,38,5,
+0,3,36,19,0,80,124,5,70,100,102,69,124,122,5,0,0,45,173,102,49,170,204,151,31,0,13,33,113,203,182,74,94,248,249,115,88,28,0,0,0,0,0,88,148,19,133,252,
+249,222,28,0,0,0,0,2,50,50,2,0,5,123,131,43,8,34,19,0,0,0,0,0,23,90,53,138,179,138,18,8,73,102,94,53,204,248,198,49,24,0,14,38,6,0,0,0,
+0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6,9,39,11,88,148,22,0,2,50,50,2,0,0,0,15,36,8,34,19,0,0,11,124,158,70,23,88,102,70,166,249,248,
+248,249,251,151,49,170,204,151,47,207,248,249,251,254,227,74,0,10,33,39,88,28,0,0,0,0,0,88,148,19,48,159,60,54,200,248,198,18,0,2,50,50,2,0,5,123,176,249,
+248,112,19,0,0,0,0,0,23,90,53,138,179,138,18,26,214,251,219,53,28,2,0,33,24,0,14,38,6,0,0,0,0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6,
+9,39,11,88,148,22,0,2,50,50,2,0,0,0,15,36,8,34,19,0,0,11,124,158,70,23,88,102,70,124,122,6,34,145,111,75,17,25,169,204,153,30,0,83,188,194,132,12,
+7,115,249,250,108,0,0,0,0,0,0,0,81,159,231,249,248,248,115,12,0,0,2,50,50,2,0,0,0,7,81,26,58,20,0,0,0,0,0,0,0,22,89,53,138,179,142,87,
+96,74,42,71,35,198,248,198,48,24,0,14,38,6,0,0,9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0,0,9,39,12,88,148,24,50,50,2,0,0,0,0,0,15,
+58,20,0,0,0,3,74,159,124,5,18,89,151,246,252,252,249,250,157,75,17,25,169,204,153,46,207,250,253,253,252,154,7,33,39,88,28,0,0,0,0,0,0,0,81,152,149,48,
+18,200,249,200,18,0,2,50,50,2,0,0,0,7,81,111,250,248,90,0,0,0,0,0,0,22,89,53,138,179,142,87,107,215,249,214,35,0,0,1,33,24,0,14,38,6,0,0,
+9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0,0,9,39,12,88,148,24,50,50,2,0,0,0,0,0,15,58,20,0,0,0,3,74,159,124,5,18,89,102,69,124,116,
+179,97,31,27,62,16,25,169,204,147,93,178,182,98,54,83,40,38,149,249,248,90,1,0,0,0,0,0,61,238,253,204,105,248,248,115,10,1,50,50,2,0,0,0,0,0,3,32,
+30,34,5,0,0,0,0,0,0,0,22,90,51,142,203,182,84,27,27,28,62,33,198,248,198,48,24,0,14,38,4,8,82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0,
+0,0,9,39,10,88,169,68,2,0,0,0,0,0,3,32,30,34,5,0,3,70,71,8,122,122,5,93,247,251,250,252,251,147,31,27,62,16,25,169,204,147,107,241,253,251,250,250,
+162,38,88,28,0,0,1,0,0,0,0,0,46,178,179,41,198,248,200,54,10,1,50,50,2,0,0,0,0,0,3,32,113,249,248,90,0,0,0,0,0,0,22,90,51,142,203,182,
+84,43,204,249,212,33,0,0,1,33,24,0,14,38,4,8,82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0,0,0,9,39,10,88,169,68,2,0,0,0,0,0,3,32,
+30,34,5,0,3,70,71,8,122,122,5,18,90,102,65,122,154,131,7,0,27,64,15,23,162,204,192,176,70,11,37,68,86,83,26,94,248,249,93,0,0,0,0,66,234,251,224,157,
+22,94,248,248,112,52,48,2,0,0,0,0,0,3,36,19,0,16,38,5,0,0,0,0,0,0,0,20,82,98,185,201,150,48,3,0,27,64,32,198,248,198,48,24,0,12,37,80,
+70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0,0,0,0,8,34,52,120,149,22,0,0,0,0,3,36,19,0,16,35,10,68,71,3,0,5,122,165,243,248,250,251,251,
+186,131,7,0,27,64,15,23,162,204,192,185,220,248,249,250,250,178,26,0,6,33,4,0,0,0,0,52,162,117,126,231,249,198,18,8,34,52,48,2,0,0,0,0,0,3,36,19,
+0,104,249,248,90,0,0,0,0,0,0,20,82,98,185,201,150,48,21,198,249,212,32,0,0,1,33,24,0,12,37,80,70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0,
+0,0,0,8,34,52,120,149,22,0,0,0,0,3,36,19,0,16,35,10,68,71,3,0,5,122,122,5,20,91,114,164,83,123,122,5,0,28,64,17,88,194,204,166,25,7,38,56,
+96,85,8,3,118,248,248,90,0,0,66,236,251,209,18,88,148,22,94,248,249,132,12,0,0,0,0,0,3,36,19,0,0,0,16,38,5,0,0,0,0,0,0,7,81,102,97,148,
+188,139,18,0,0,28,64,34,198,248,198,48,20,6,83,88,7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0,0,0,0,1,50,65,12,88,148,22,0,0,3,36,19,0,
+0,0,15,87,70,2,0,0,0,85,249,252,248,249,252,185,83,123,122,5,0,28,64,17,88,194,204,166,49,213,249,250,251,250,139,3,38,15,0,0,0,0,52,164,120,65,198,250,
+231,39,0,1,50,65,12,0,0,0,0,0,3,36,19,0,0,0,104,249,248,90,0,0,0,0,0,7,81,102,97,148,188,139,18,18,198,249,212,34,0,0,1,33,20,6,83,88,
+7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0,0,0,0,1,50,65,12,88,148,22,0,0,3,36,19,0,0,0,15,87,70,2,0,0,0,5,122,122,1,39,186,154,
+102,65,125,122,11,0,30,97,175,172,175,203,155,51,38,88,51,52,81,42,11,94,248,248,90,66,245,251,213,18,0,0,88,148,24,126,249,248,98,12,0,0,0,3,36,19,0,0,
+0,0,0,16,38,5,0,0,0,0,10,79,102,79,85,71,138,179,138,18,0,0,30,32,18,198,248,198,49,86,66,16,36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0,
+0,0,2,50,48,11,37,12,88,148,22,3,36,19,0,0,0,3,67,75,35,4,0,0,81,243,248,252,252,249,155,98,102,65,125,122,11,0,30,97,175,172,175,203,155,73,223,250,
+250,250,250,155,11,0,0,0,0,52,164,120,79,229,248,198,100,148,24,50,48,11,37,12,0,0,0,3,36,19,0,0,0,0,0,104,249,248,148,0,0,0,10,79,102,79,85,71,
+138,179,138,18,18,198,249,205,18,0,0,0,33,86,66,16,36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0,0,0,2,50,48,11,37,12,88,148,22,3,36,19,0,0,
+0,3,67,75,35,4,0,0,0,0,5,117,121,135,110,98
+};
+
+
+#endif
diff --git a/kscreensaver/kdesavers/Flux.cpp b/kscreensaver/kdesavers/Flux.cpp
new file mode 100644
index 00000000..403c07b6
--- /dev/null
+++ b/kscreensaver/kdesavers/Flux.cpp
@@ -0,0 +1,967 @@
+//============================================================================
+//
+// Terence Welsh Screensaver - Flux
+// http://www.reallyslick.com/
+//
+// Ported to KDE by Karl Robillard
+//
+/*
+ * Copyright (C) 2002 Terence M. Welsh
+ *
+ * Flux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Flux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+//============================================================================
+
+
+/*
+ TODO
+
+ [ ] Regular and others are messed up after Sparkler.
+ Insane seems to reset them.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <qtimer.h>
+#include "Flux.h"
+#include "Flux.moc"
+
+
+#define NUMCONSTS 8
+#define PIx2 6.28318530718f
+#define DEG2RAD 0.0174532925f
+
+
+void hsl2rgb(float h, float s, float l, float &r, float &g, float &b)
+{
+ // hue influence
+ if(h < 0.166667){ // full red, some green
+ r = 1.0;
+ g = h * 6.0f;
+ b = 0.0;
+ }
+ else {
+ if(h < 0.5){ // full green
+ g = 1.0;
+ if(h < 0.333333){ // some red
+ r = 1.0f - ((h - 0.166667f) * 6.0f);
+ b = 0.0;
+ }
+ else{ // some blue
+ b = (h - 0.333333f) * 6.0f;
+ r = 0.0;
+ }
+ }
+ else{
+ if(h < 0.833333){ // full blue
+ b = 1.0;
+ if(h < 0.666667){ // some green
+ g = 1.0f - ((h - 0.5f) * 6.0f);
+ r = 0.0;
+ }
+ else{ // some red
+ r = (h - 0.666667f) * 6.0f;
+ g = 0.0;
+ }
+ }
+ else{ // full red, some blue
+ r = 1.0;
+ b = 1.0f - ((h - 0.833333f) * 6.0f);
+ g = 0.0;
+ }
+ }
+ }
+
+ // saturation influence
+ r = 1.0f - (s * (1.0f - r));
+ g = 1.0f - (s * (1.0f - g));
+ b = 1.0f - (s * (1.0f - b));
+
+ // luminosity influence
+ r *= l;
+ g *= l;
+ b *= l;
+}
+
+
+// Useful random number macros
+// Don't forget to initialize with srand()
+inline int myRandi(int x){
+ return((rand() * x) / RAND_MAX);
+}
+inline float myRandf(float x){
+ return(float(rand() * x) / float(RAND_MAX));
+}
+
+
+//----------------------------------------------------------------------------
+
+
+// Flux context to allow many instances.
+static FluxWidget* _fc = 0;
+
+static int whichparticle;
+
+
+// This class is poorly named. It's actually a whole trail of particles.
+class particle
+{
+public:
+
+ particle();
+ ~particle();
+ float update(float *c);
+
+private:
+
+ float** vertices;
+ short trails;
+ short counter;
+ float offset[3];
+};
+
+
+particle::particle()
+{
+ // Offsets are somewhat like default positions for the head of each
+ // particle trail. Offsets spread out the particle trails and keep
+ // them from all overlapping.
+ offset[0] = cos(PIx2 * float(whichparticle) / float(_fc->dParticles));
+ offset[1] = float(whichparticle) / float(_fc->dParticles) - 0.5f;
+ offset[2] = sin(PIx2 * float(whichparticle) / float(_fc->dParticles));
+ whichparticle++;
+
+ // Initialize memory and set initial positions out of view of the camera
+ trails = _fc->dTrail;
+ vertices = new float*[ trails ];
+
+ int i;
+ for(i=0; i<trails; i++)
+ {
+ vertices[i] = new float[5]; // 0,1,2 = position, 3 = hue, 4 = saturation
+ vertices[i][0] = 0.0f;
+ vertices[i][1] = 3.0f;
+ vertices[i][2] = 0.0f;
+ vertices[i][3] = 0.0f;
+ vertices[i][4] = 0.0f;
+ }
+
+ counter = 0;
+}
+
+
+particle::~particle()
+{
+ for(int i=0; i<trails; i++)
+ delete[] vertices[i];
+ delete[] vertices;
+}
+
+
+float particle::update(float *c)
+{
+ int i, p, growth;
+ float rgb[3];
+ float cx, cy, cz; // Containment variables
+ float luminosity;
+ static float expander = 1.0f + 0.0005f * float(_fc->dExpansion);
+ static float blower = 0.001f * float(_fc->dWind);
+ //static float otherxyz[3];
+ float depth = 0;
+
+ // Record old position
+ int oldc = counter;
+ float oldpos[3];
+ oldpos[0] = vertices[oldc][0];
+ oldpos[1] = vertices[oldc][1];
+ oldpos[2] = vertices[oldc][2];
+
+ counter ++;
+ if(counter >= _fc->dTrail)
+ counter = 0;
+
+ // Here's the iterative math for calculating new vertex positions
+ // first calculate limiting terms which keep vertices from constantly
+ // flying off to infinity
+ cx = vertices[oldc][0] * (1.0f - 1.0f / (vertices[oldc][0] * vertices[oldc][0] + 1.0f));
+ cy = vertices[oldc][1] * (1.0f - 1.0f / (vertices[oldc][1] * vertices[oldc][1] + 1.0f));
+ cz = vertices[oldc][2] * (1.0f - 1.0f / (vertices[oldc][2] * vertices[oldc][2] + 1.0f));
+ // then calculate new positions
+ vertices[counter][0] = vertices[oldc][0] + c[6] * offset[0] - cx
+ + c[2] * vertices[oldc][1]
+ + c[5] * vertices[oldc][2];
+ vertices[counter][1] = vertices[oldc][1] + c[6] * offset[1] - cy
+ + c[1] * vertices[oldc][2]
+ + c[4] * vertices[oldc][0];
+ vertices[counter][2] = vertices[oldc][2] + c[6] * offset[2] - cz
+ + c[0] * vertices[oldc][0]
+ + c[3] * vertices[oldc][1];
+
+ // Pick a hue
+ vertices[counter][3] = cx * cx + cy * cy + cz * cz;
+ if(vertices[counter][3] > 1.0f)
+ vertices[counter][3] = 1.0f;
+ vertices[counter][3] += c[7];
+ // Limit the hue (0 - 1)
+ if(vertices[counter][3] > 1.0f)
+ vertices[counter][3] -= 1.0f;
+ if(vertices[counter][3] < 0.0f)
+ vertices[counter][3] += 1.0f;
+ // Pick a saturation
+ vertices[counter][4] = c[0] + vertices[counter][3];
+ // Limit the saturation (0 - 1)
+ if(vertices[counter][4] < 0.0f)
+ vertices[counter][4] = -vertices[counter][4];
+ vertices[counter][4] -= float(int(vertices[counter][4]));
+ vertices[counter][4] = 1.0f - (vertices[counter][4] * vertices[counter][4]);
+
+ // Bring particles back if they escape
+ if(!counter){
+ if((vertices[0][0] > 1000000000.0f) || (vertices[0][0] < -1000000000.0f)
+ || (vertices[0][1] > 1000000000.0f) || (vertices[0][1] < -1000000000.0f)
+ || (vertices[2][2] > 1000000000.0f) || (vertices[0][2] < -1000000000.0f)){
+ vertices[0][0] = myRandf(2.0f) - 1.0f;
+ vertices[0][1] = myRandf(2.0f) - 1.0f;
+ vertices[0][2] = myRandf(2.0f) - 1.0f;
+ }
+ }
+
+ // Draw every vertex in particle trail
+ p = counter;
+ growth = 0;
+ luminosity = _fc->lumdiff;
+ for(i=0; i<_fc->dTrail; i++){
+ p ++;
+ if(p >= _fc->dTrail)
+ p = 0;
+ growth++;
+
+ // assign color to particle
+ hsl2rgb(vertices[p][3], vertices[p][4], luminosity, rgb[0], rgb[1], rgb[2]);
+ glColor3fv(rgb);
+
+ glPushMatrix();
+ if(_fc->dGeometry == 1) // Spheres
+ glTranslatef(vertices[p][0], vertices[p][1], vertices[p][2]);
+ else{ // Points or lights
+ depth = _fc->cosCameraAngle * vertices[p][2] - _fc->sinCameraAngle * vertices[p][0];
+ glTranslatef(_fc->cosCameraAngle * vertices[p][0] + _fc->sinCameraAngle
+ * vertices[p][2], vertices[p][1], depth);
+ }
+ if(_fc->dGeometry){ // Spheres or lights
+ switch(_fc->dTrail - growth){
+ case 0:
+ glScalef(0.259f, 0.259f, 0.259f);
+ break;
+ case 1:
+ glScalef(0.5f, 0.5f, 0.5f);
+ break;
+ case 2:
+ glScalef(0.707f, 0.707f, 0.707f);
+ break;
+ case 3:
+ glScalef(0.866f, 0.866f, 0.866f);
+ break;
+ case 4:
+ glScalef(0.966f, 0.966f, 0.966f);
+ }
+ }
+ switch(_fc->dGeometry){
+ case 0: // Points
+ switch(_fc->dTrail - growth){
+ case 0:
+ glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.001036f));
+ break;
+ case 1:
+ glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.002f));
+ break;
+ case 2:
+ glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.002828f));
+ break;
+ case 3:
+ glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.003464f));
+ break;
+ case 4:
+ glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.003864f));
+ break;
+ default:
+ glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.004f));
+ }
+ glBegin(GL_POINTS);
+ glVertex3f(0.0f,0.0f,0.0f);
+ glEnd();
+ break;
+ case 1: // Spheres
+ case 2: // Lights
+ glCallList(1);
+ }
+ glPopMatrix();
+ vertices[p][0] *= expander;
+ vertices[p][1] *= expander;
+ vertices[p][2] *= expander;
+ vertices[p][2] += blower;
+ luminosity += _fc->lumdiff;
+ }
+
+ // Find distance between new position and old position and return it
+ oldpos[0] -= vertices[counter][0];
+ oldpos[1] -= vertices[counter][1];
+ oldpos[2] -= vertices[counter][2];
+ return(float(sqrt(oldpos[0] * oldpos[0] + oldpos[1] * oldpos[1] + oldpos[2] * oldpos[2])));
+}
+
+
+// This class is a set of particle trails and constants that enter
+// into their equations of motion.
+class flux
+{
+public:
+
+ flux();
+ ~flux();
+ void update();
+
+ particle *particles;
+ int randomize;
+ float c[NUMCONSTS]; // constants
+ float cv[NUMCONSTS]; // constants' change velocities
+ int currentSmartConstant;
+ float oldDistance;
+};
+
+
+flux::flux()
+{
+ whichparticle = 0;
+
+ particles = new particle[_fc->dParticles];
+ randomize = 1;
+
+ float instability = _fc->dInstability;
+ int i;
+ for(i=0; i<NUMCONSTS; i++)
+ {
+ c[i] = myRandf(2.0f) - 1.0f;
+ cv[i] = myRandf(0.000005f * instability * instability)
+ + 0.000001f * instability * instability;
+ }
+
+ currentSmartConstant = 0;
+ oldDistance = 0.0f;
+}
+
+
+flux::~flux()
+{
+ delete[] particles;
+}
+
+
+void flux::update()
+{
+ int i;
+
+ // randomize constants
+ if(_fc->dRandomize){
+ randomize --;
+ if(randomize <= 0){
+ for(i=0; i<NUMCONSTS; i++)
+ c[i] = myRandf(2.0f) - 1.0f;
+ int temp = 101 - _fc->dRandomize;
+ temp = temp * temp;
+ randomize = temp + myRandi(temp);
+ }
+ }
+
+ // update constants
+ for(i=0; i<NUMCONSTS; i++){
+ c[i] += cv[i];
+ if(c[i] >= 1.0f){
+ c[i] = 1.0f;
+ cv[i] = -cv[i];
+ }
+ if(c[i] <= -1.0f){
+ c[i] = -1.0f;
+ cv[i] = -cv[i];
+ }
+ }
+
+ // update all particles in this flux field
+ float dist;
+ for(i=0; i<_fc->dParticles; i++)
+ dist = particles[i].update(c);
+
+ // use dist from last particle to activate smart constants
+ _fc->dSmart = 0;
+ if(_fc->dSmart){
+ const float upper = 0.4f;
+ const float lower = 0.2f;
+ int beSmart = 0;
+ if(dist > upper && dist > oldDistance)
+ beSmart = 1;
+ if(dist < lower && dist < oldDistance)
+ beSmart = 1;
+ if(beSmart){
+ cv[currentSmartConstant] = -cv[currentSmartConstant];
+ currentSmartConstant ++;
+ if(currentSmartConstant >= _fc->dSmart)
+ currentSmartConstant = 0;
+ }
+ oldDistance = dist;
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+
+FluxWidget::FluxWidget( QWidget* parent, const char* name )
+ : QGLWidget(parent, name), _fluxes(0)
+{
+ setDefaults( Regular );
+
+ _frameTime = 1000 / 60;
+ _timer = new QTimer( this );
+ connect( _timer, SIGNAL(timeout()), this, SLOT(nextFrame()) );
+}
+
+
+FluxWidget::~FluxWidget()
+{
+ // Free memory
+ delete[] _fluxes;
+}
+
+
+void FluxWidget::paintGL()
+{
+ // clear the screen
+ glLoadIdentity();
+
+ if(dBlur) // partially
+ {
+ int viewport[4];
+ glGetIntegerv(GL_VIEWPORT, viewport);
+ float viewRatio = float(viewport[2]) / float(viewport[3]);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
+ glColor4f(0.0f, 0.0f, 0.0f, 0.5f - (float(sqrt(sqrt(double(dBlur)))) * 0.15495f));
+ glBegin(GL_TRIANGLE_STRIP);
+ glVertex3f(-3.0f * viewRatio, -3.0f, 0.0f);
+ glVertex3f(3.0f * viewRatio, -3.0f, 0.0f);
+ glVertex3f(-3.0f * viewRatio, 3.0f, 0.0f);
+ glVertex3f(3.0f * viewRatio, 3.0f, 0.0f);
+ glEnd();
+ }
+ else // completely
+ {
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
+
+ cameraAngle += 0.01f * float(dRotation);
+ if(cameraAngle >= 360.0f)
+ cameraAngle -= 360.0f;
+ if(dGeometry == 1) // Only rotate for spheres
+ glRotatef(cameraAngle, 0.0f, 1.0f, 0.0f);
+ else
+ {
+ cosCameraAngle = cos(cameraAngle * DEG2RAD);
+ sinCameraAngle = sin(cameraAngle * DEG2RAD);
+ }
+
+ // set up blend modes for rendering particles
+ switch(dGeometry)
+ {
+ case 0: // Blending for points
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glEnable(GL_BLEND);
+ glEnable(GL_POINT_SMOOTH);
+ glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
+ break;
+
+ case 1: // No blending for spheres, but we need z-buffering
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+ glClear(GL_DEPTH_BUFFER_BIT);
+ break;
+
+ case 2: // Blending for lights
+ glBlendFunc(GL_ONE, GL_ONE);
+ glEnable(GL_BLEND);
+ }
+
+ // Update particles
+ if( _fluxes )
+ {
+ _fc = this;
+ int i;
+ for(i=0; i<dFluxes; i++)
+ _fluxes[i].update();
+ }
+
+ glFlush();
+}
+
+
+void FluxWidget::resizeGL( int w, int h )
+{
+ glViewport(0, 0, w, h );
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(100.0, (float) w / (float) h, 0.01, 200);
+ glTranslatef(0.0, 0.0, -2.5);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+// Window initialization
+void FluxWidget::initializeGL()
+{
+ //resizeGL( width(), height() );
+
+ updateParameters();
+
+ _timer->start( _frameTime, true );
+}
+
+
+#ifdef UNIT_TEST
+void FluxWidget::keyPressEvent( QKeyEvent* e )
+{
+ if( e->key() == Qt::Key_0 ) { setDefaults( 0 ); updateParameters(); }
+ if( e->key() == Qt::Key_1 ) { setDefaults( 1 ); updateParameters(); }
+ if( e->key() == Qt::Key_2 ) { setDefaults( 2 ); updateParameters(); }
+ if( e->key() == Qt::Key_3 ) { setDefaults( 3 ); updateParameters(); }
+ if( e->key() == Qt::Key_4 ) { setDefaults( 4 ); updateParameters(); }
+ if( e->key() == Qt::Key_5 ) { setDefaults( 5 ); updateParameters(); }
+}
+#endif
+
+
+void FluxWidget::nextFrame()
+{
+ updateGL();
+ _timer->start( _frameTime, true );
+}
+
+
+/**
+ May be called at any time - makes no OpenGL calls.
+*/
+void FluxWidget::setDefaults( int which )
+{
+ switch(which)
+ {
+ case Hypnotic:
+ dFluxes = 2;
+ dParticles = 10;
+ dTrail = 40;
+ dGeometry = 2;
+ dSize = 15;
+ dRandomize = 80;
+ dExpansion = 20;
+ dRotation = 0;
+ dWind = 40;
+ dInstability = 10;
+ dBlur = 30;
+ break;
+
+ case Insane:
+ dFluxes = 4;
+ dParticles = 30;
+ dTrail = 8;
+ dGeometry = 2;
+ dSize = 25;
+ dRandomize = 0;
+ dExpansion = 80;
+ dRotation = 60;
+ dWind = 40;
+ dInstability = 100;
+ dBlur = 10;
+ break;
+
+ case Sparklers:
+ dFluxes = 3;
+ dParticles = 20;
+ dTrail = 6;
+ dGeometry = 1;
+ dSize = 20;
+ dComplexity = 3;
+ dRandomize = 85;
+ dExpansion = 60;
+ dRotation = 30;
+ dWind = 20;
+ dInstability = 30;
+ dBlur = 0;
+ break;
+
+ case Paradigm:
+ dFluxes = 1;
+ dParticles = 40;
+ dTrail = 40;
+ dGeometry = 2;
+ dSize = 5;
+ dRandomize = 90;
+ dExpansion = 30;
+ dRotation = 20;
+ dWind = 10;
+ dInstability = 5;
+ dBlur = 10;
+ break;
+
+ case Galactic:
+ dFluxes = 1;
+ dParticles = 2;
+ dTrail = 1500;
+ dGeometry = 2;
+ dSize = 10;
+ dRandomize = 0;
+ dExpansion = 5;
+ dRotation = 25;
+ dWind = 0;
+ dInstability = 5;
+ dBlur = 0;
+ break;
+
+ case Regular:
+ default:
+ dFluxes = 1;
+ dParticles = 20;
+ dTrail = 40;
+ dGeometry = 2;
+ dSize = 15;
+ dRandomize = 0;
+ dExpansion = 40;
+ dRotation = 30;
+ dWind = 20;
+ dInstability = 20;
+ dBlur = 0;
+ break;
+ }
+}
+
+
+/**
+ Called after dGeometry, dTrail, or dFluxes is changed
+ (such as with setDefaults).
+*/
+void FluxWidget::updateParameters()
+{
+ int i, j;
+ float x, y, temp;
+
+ srand((unsigned)time(NULL));
+ rand(); rand(); rand(); rand(); rand();
+
+ cameraAngle = 0.0f;
+
+ glFrontFace(GL_CCW);
+ glEnable(GL_CULL_FACE);
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if(dGeometry == 0)
+ {
+ glDisable(GL_LIGHTING);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_TEXTURE_2D);
+
+ glEnable(GL_POINT_SMOOTH);
+ //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
+ }
+ else if(dGeometry == 1) // Spheres and their lighting
+ {
+ glNewList(1, GL_COMPILE);
+ GLUquadricObj* qobj = gluNewQuadric();
+ gluSphere(qobj, 0.005f * dSize, dComplexity + 2, dComplexity + 1);
+ gluDeleteQuadric(qobj);
+ glEndList();
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ float ambient[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float diffuse[4] = {1.0f, 1.0f, 1.0f, 0.0f};
+ float specular[4] = {1.0f, 1.0f, 1.0f, 0.0f};
+ float position[4] = {500.0f, 500.0f, 500.0f, 0.0f};
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glEnable(GL_COLOR_MATERIAL);
+ glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+ }
+ else if(dGeometry == 2) // Init lights
+ {
+ for(i=0; i<LIGHTSIZE; i++)
+ {
+ for(j=0; j<LIGHTSIZE; j++)
+ {
+ x = float(i - LIGHTSIZE / 2) / float(LIGHTSIZE / 2);
+ y = float(j - LIGHTSIZE / 2) / float(LIGHTSIZE / 2);
+ temp = 1.0f - float(sqrt((x * x) + (y * y)));
+ if(temp > 1.0f)
+ temp = 1.0f;
+ if(temp < 0.0f)
+ temp = 0.0f;
+ lightTexture[i][j] = (unsigned char) (255.0f * temp * temp);
+ }
+ }
+
+ glDisable(GL_LIGHTING);
+ glDisable(GL_COLOR_MATERIAL);
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, 1);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexImage2D(GL_TEXTURE_2D, 0, 1, LIGHTSIZE, LIGHTSIZE, 0,
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, lightTexture);
+
+ temp = float(dSize) * 0.005f;
+ glNewList(1, GL_COMPILE);
+ glBindTexture(GL_TEXTURE_2D, 1);
+ glBegin(GL_TRIANGLES);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex3f(-temp, -temp, 0.0f);
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex3f(temp, -temp, 0.0f);
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex3f(temp, temp, 0.0f);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex3f(-temp, -temp, 0.0f);
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex3f(temp, temp, 0.0f);
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex3f(-temp, temp, 0.0f);
+ glEnd();
+ glEndList();
+ }
+
+ // Initialize luminosity difference
+ lumdiff = 1.0f / float(dTrail);
+
+ _fc = this;
+ delete[] _fluxes;
+ _fluxes = new flux[dFluxes];
+}
+
+
+//----------------------------------------------------------------------------
+
+
+#ifndef UNIT_TEST
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char* kss_applicationName = "kflux.kss";
+ KDE_EXPORT const char* kss_description = I18N_NOOP( "Flux" );
+ KDE_EXPORT const char* kss_version = "1.0";
+
+ KDE_EXPORT KScreenSaver* kss_create( WId id )
+ {
+ return new KFluxScreenSaver( id );
+ }
+
+ KDE_EXPORT QDialog* kss_setup()
+ {
+ return new KFluxSetup;
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+
+KFluxScreenSaver::KFluxScreenSaver( WId id ) : KScreenSaver( id )
+{
+ _flux = new FluxWidget;
+
+ readSettings();
+
+ embed( _flux );
+ _flux->show();
+}
+
+
+KFluxScreenSaver::~KFluxScreenSaver()
+{
+}
+
+
+static int filterRandom( int n )
+{
+ if( (n < 0) || (n >= FluxWidget::DefaultModes) )
+ {
+ srand((unsigned)time(NULL));
+ n = rand() % FluxWidget::DefaultModes;
+ }
+ return n;
+}
+
+
+void KFluxScreenSaver::readSettings()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ _mode = config->readNumEntry( "Mode", FluxWidget::Regular );
+ _flux->setDefaults( filterRandom(_mode) );
+}
+
+
+/**
+ Any invalid mode will select one at random.
+*/
+void KFluxScreenSaver::setMode( int id )
+{
+ _mode = id;
+ _flux->setDefaults( filterRandom(id) );
+ _flux->updateParameters();
+}
+
+
+//----------------------------------------------------------------------------
+
+
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <kbuttonbox.h>
+#include <kmessagebox.h>
+
+
+static const char* defaultText[] =
+{
+ I18N_NOOP( "Regular" ),
+ I18N_NOOP( "Hypnotic" ),
+ I18N_NOOP( "Insane" ),
+ I18N_NOOP( "Sparklers" ),
+ I18N_NOOP( "Paradigm" ),
+ I18N_NOOP( "Galactic" ),
+ I18N_NOOP( "(Random)" ),
+ 0
+};
+
+
+KFluxSetup::KFluxSetup( QWidget* parent, const char* name )
+ : KDialogBase( parent, name, true, i18n( "Setup Flux Screen Saver" ),
+ Ok|Cancel|Help, Ok, true )
+{
+ setButtonText( Help, i18n( "A&bout" ) );
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout* top = new QHBoxLayout( main, 0, spacingHint() );
+ QVBoxLayout* leftCol = new QVBoxLayout;
+ top->addLayout( leftCol );
+
+ // Parameters
+ QLabel* label = new QLabel( i18n("Mode:"), main );
+ leftCol->addWidget( label );
+
+ modeW = new QComboBox( main );
+ int i = 0;
+ while (defaultText[i])
+ modeW->insertItem( i18n(defaultText[i++]) );
+ leftCol->addWidget( modeW );
+
+ leftCol->addStretch();
+
+ // Preview
+ QWidget* preview;
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 165 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ _saver = new KFluxScreenSaver( preview->winId() );
+ top->addWidget(preview);
+
+ // Now that we have _saver...
+ modeW->setCurrentItem( _saver->mode() ); // set before we connect
+ connect( modeW, SIGNAL(activated(int)), _saver, SLOT(setMode(int)) );
+}
+
+
+KFluxSetup::~KFluxSetup()
+{
+ delete _saver;
+}
+
+
+void KFluxSetup::slotHelp()
+{
+ KMessageBox::about(this,
+ i18n("<h3>Flux 1.0</h3>\n<p>Copyright (c) 2002 Terence M. Welsh<br>\n<a href=\"http://www.reallyslick.com/\">http://www.reallyslick.com/</a></p>\n\n<p>Ported to KDE by Karl Robillard</p>"),
+ QString::null, KMessageBox::AllowLink);
+}
+
+
+/**
+ Ok pressed - save settings and exit
+*/
+void KFluxSetup::slotOk()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ QString val;
+ val.setNum( modeW->currentItem() );
+ config->writeEntry("Mode", val );
+
+ config->sync();
+ accept();
+}
+#endif
+
+
+//----------------------------------------------------------------------------
+
+
+#ifdef UNIT_TEST
+// moc Flux.h -o Flux.moc
+// g++ -g -DUNIT_TEST Flux.cpp -I/usr/lib/qt3/include -lqt -L/usr/lib/qt3/lib -lGLU -lGL
+
+#include <qapplication.h>
+
+int main( int argc, char** argv )
+{
+ QApplication app( argc, argv );
+
+ FluxWidget w;
+ w.setDefaults( FluxWidget::Sparklers );
+ app.setMainWidget( &w );
+ w.show();
+
+ return app.exec();
+}
+#endif
+
+
+//EOF
diff --git a/kscreensaver/kdesavers/Flux.h b/kscreensaver/kdesavers/Flux.h
new file mode 100644
index 00000000..7fe20172
--- /dev/null
+++ b/kscreensaver/kdesavers/Flux.h
@@ -0,0 +1,147 @@
+#ifndef __FLUXSS_H__
+#define __FLUXSS_H__
+//============================================================================
+//
+// Terence Welsh Screensaver - Flux
+// http://www.reallyslick.com/
+//
+// Ported to KDE by Karl Robillard
+//
+//============================================================================
+
+
+#include <qgl.h>
+
+
+#define LIGHTSIZE 64
+
+
+class flux;
+class particle;
+class QTimer;
+
+class FluxWidget : public QGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ enum eDefault
+ {
+ Regular,
+ Hypnotic,
+ Insane,
+ Sparklers,
+ Paradigm,
+ Galactic,
+ DefaultModes
+ };
+
+ FluxWidget( QWidget* parent=0, const char* name=0 );
+ ~FluxWidget();
+
+ void setDefaults( int which );
+ void updateParameters();
+
+protected:
+
+ void paintGL();
+ void resizeGL( int w, int h );
+ void initializeGL();
+#ifdef UNIT_TEST
+ void keyPressEvent( QKeyEvent* );
+#endif
+
+private slots:
+
+ void nextFrame();
+
+private:
+
+ float lumdiff;
+ float cameraAngle;
+ float cosCameraAngle, sinCameraAngle;
+ unsigned char lightTexture[LIGHTSIZE][LIGHTSIZE];
+
+ int dFluxes;
+ int dParticles;
+ int dTrail;
+ int dGeometry;
+ float dSize;
+ int dComplexity;
+ int dRandomize;
+ int dExpansion;
+ int dRotation;
+ int dWind;
+ float dInstability;
+ int dBlur;
+ int dSmart;
+ int dPriority;
+
+ flux* _fluxes;
+
+ // Using QTimer rather than timerEvent() to avoid getting locked out of
+ // the QEvent loop on lower-end systems. Ian Geiser <geiseri@kde.org>
+ // says this is the way to go.
+ QTimer* _timer;
+ int _frameTime;
+
+ friend class flux;
+ friend class particle;
+};
+
+
+#ifndef UNIT_TEST
+#include <kdialogbase.h>
+#include <kscreensaver.h>
+
+
+class KFluxScreenSaver : public KScreenSaver
+{
+ Q_OBJECT
+
+public:
+
+ KFluxScreenSaver( WId id );
+ virtual ~KFluxScreenSaver();
+
+ int mode() const { return _mode; }
+
+public slots:
+
+ void setMode( int );
+
+private:
+
+ void readSettings();
+
+ FluxWidget* _flux;
+ int _mode;
+};
+
+
+class QComboBox;
+
+class KFluxSetup : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ KFluxSetup( QWidget* parent = 0, const char* name = 0 );
+ ~KFluxSetup();
+
+private slots:
+
+ void slotHelp();
+ void slotOk();
+
+private:
+
+ QComboBox* modeW;
+ KFluxScreenSaver* _saver;
+};
+#endif
+
+
+#endif //__FLUXSS_H__
diff --git a/kscreensaver/kdesavers/KBanner.desktop b/kscreensaver/kdesavers/KBanner.desktop
new file mode 100644
index 00000000..cfc11caf
--- /dev/null
+++ b/kscreensaver/kdesavers/KBanner.desktop
@@ -0,0 +1,243 @@
+[Desktop Entry]
+Exec=kbanner.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Banners & Pictures
+Name=Banner
+Name[af]=Bannier
+Name[bg]=Банер
+Name[br]=Lugan
+Name[ca]=Rètol
+Name[cs]=Běžící text
+Name[cy]=Baner
+Name[de]=Lauftext
+Name[el]=Τίτλος
+Name[eo]=Standardo
+Name[es]=Pancarta
+Name[et]=Tekstiriba
+Name[eu]=Titularra
+Name[fa]=بنر
+Name[fi]=Viesti
+Name[fr]=Bannière
+Name[fy]=Ljochtkrante
+Name[ga]=Meirge
+Name[gl]=Pancarta
+Name[he]=כתובית
+Name[hi]=बैनर
+Name[hu]=Felirat
+Name[is]=Borði
+Name[it]=Testo scorrevole
+Name[ja]=バナー
+Name[ka]=აბრა
+Name[lt]=Plakatas
+Name[lv]=Banners
+Name[mk]=Транспарент
+Name[ms]=Kain Rentang
+Name[nds]=Looptext
+Name[ne]=ब्यानर
+Name[nl]=Lichtkrant
+Name[nn]=Fane
+Name[pa]=ਬੈਨਰ
+Name[pt]=Cartaz
+Name[ru]=Бегущая строка
+Name[sl]=Napis
+Name[sr]=Застава
+Name[sr@Latn]=Zastava
+Name[sv]=Rubrik
+Name[ta]=பேனர்
+Name[tg]=Давида истодаи рах
+Name[th]=แบนเนอร์
+Name[tr]=Afiş
+Name[uk]=Транспарант
+Name[ven]=Muvhala
+Name[vi]=Biểu ngữ
+Name[xh]=Isiqwentshu selaphu
+Name[zh_CN]=横幅
+Name[zh_TW]=標誌
+Name[zu]=Ibhodi elinomyalezo
+
+[Desktop Action Setup]
+Exec=kbanner.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kbanner.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kbanner.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KBlob.desktop b/kscreensaver/kdesavers/KBlob.desktop
new file mode 100644
index 00000000..13aaba1b
--- /dev/null
+++ b/kscreensaver/kdesavers/KBlob.desktop
@@ -0,0 +1,227 @@
+[Desktop Entry]
+Exec=kblob.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Visit to Flatland
+Name=Blob
+Name[bg]=Петно
+Name[br]=Pokard
+Name[cs]=Kaňka
+Name[cy]=Smotyn
+Name[da]=Dråbe
+Name[de]=Blob 
+Name[eo]=Gutoj
+Name[et]=Piisk
+Name[eu]=Tanta
+Name[fi]=Kuplat
+Name[he]=כתמים
+Name[hi]=ब्लॉब
+Name[ja]=斑点
+Name[ka]=წვეთები
+Name[lt]=Rutuliukas
+Name[mk]=Дамка
+Name[nb]=Fargeflekk
+Name[ne]=ब्लब
+Name[nn]=Klattar
+Name[pl]=Bąbel
+Name[ro]=Bule
+Name[ru]=Геометрические построения
+Name[sl]=Kepica
+Name[sr]=Блоб
+Name[sv]=Färgfläck
+Name[ta]=தொழிற்பொருள்
+Name[tg]=Асос гузории геометрӣ
+Name[th]=รอยเปื้อน
+Name[tr]=Damlacık
+Name[uk]=Геометричні візерунки
+Name[ven]=Tshileme
+Name[vi]=Giọt nước
+Name[xh]=Ichaphaza elincinane
+Name[zh_CN]=光线
+Name[zh_TW]=斑點
+
+[Desktop Action Setup]
+Exec=kblob.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kblob.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kblob.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KClock.desktop b/kscreensaver/kdesavers/KClock.desktop
new file mode 100644
index 00000000..78a82d76
--- /dev/null
+++ b/kscreensaver/kdesavers/KClock.desktop
@@ -0,0 +1,252 @@
+[Desktop Entry]
+Exec=kclock.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Miscellaneous
+Name=Clock
+Name[bg]=Часовник
+Name[br]=Eurier
+Name[bs]=Sat
+Name[ca]=Rellotge
+Name[cs]=Hodiny
+Name[cy]=Cloc
+Name[da]=Ur
+Name[de]=Uhr
+Name[el]=Ρολόι
+Name[eo]=Horloĝo
+Name[es]=Reloj
+Name[et]=Kell
+Name[eu]=Erlojua
+Name[fa]=ساعت
+Name[fi]=Kello
+Name[fr]=Horloge
+Name[fy]=Klok
+Name[ga]=Clog
+Name[gl]=Reloxio
+Name[he]=שעון
+Name[hi]=घड़ी
+Name[hu]=Óra
+Name[is]=Klukka
+Name[it]=Orologio
+Name[ja]=時計
+Name[ka]=საათი
+Name[lt]=Laikrodis
+Name[lv]=Pulkstenis
+Name[mk]=Часовник
+Name[ms]=Jam
+Name[nb]=Klokke
+Name[nds]=Klock
+Name[ne]=घडी
+Name[nl]=Klok
+Name[nn]=Klokke
+Name[pa]=ਘੜੀ
+Name[pl]=Zegar
+Name[pt]=Relógio
+Name[pt_BR]=Relógio
+Name[ro]=Ceas
+Name[ru]=Часы
+Name[rw]=Isaha
+Name[sk]=Hodiny
+Name[sl]=Ura
+Name[sr]=Часовник
+Name[sr@Latn]=Časovnik
+Name[sv]=Klocka
+Name[ta]=கடிகாரம்
+Name[tg]=Соат
+Name[th]=นาฬิกา
+Name[tr]=Saat
+Name[uk]=Годинник
+Name[uz]=Soat
+Name[uz@cyrillic]=Соат
+Name[ven]=Tshifhinga
+Name[vi]=Đồng hồ
+Name[xh]=Ikloko
+Name[zh_CN]=时钟
+Name[zh_TW]=時鐘
+Name[zu]=Iwashi
+
+[Desktop Action Setup]
+Exec=kclock.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kclock.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kclock.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KEuphoria.desktop b/kscreensaver/kdesavers/KEuphoria.desktop
new file mode 100644
index 00000000..8b62da28
--- /dev/null
+++ b/kscreensaver/kdesavers/KEuphoria.desktop
@@ -0,0 +1,233 @@
+[Desktop Entry]
+Exec=keuphoria.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=Euphoria (GL)
+Name[bg]=Еуфория
+Name[ca]=Eufòria (GL)
+Name[cy]=Iwfforia (GL)
+Name[da]=Eufori (GL)
+Name[de]=Euphorie
+Name[el]=Ευφορία (GL)
+Name[es]=Euforia (GL)
+Name[et]=Eufooria (GL)
+Name[eu]=Euforia (GL)
+Name[fa]=شادی (GL)
+Name[fr]=Euphorie (GL)
+Name[he]=אופוריה (GL)
+Name[hi]=परम आनंद (जीएल)
+Name[hu]=Euphoria (OpenGL)
+Name[it]=Euforia (GL)
+Name[ja]=幸福 (GL)
+Name[ka]=ეიფორია (GL)
+Name[mk]=Еуфорија (GL)
+Name[mt]=Ewforija (GL)
+Name[nb]=Eufori (GL)
+Name[nds]=Euphorie (GL)
+Name[ne]=यूफोरिया (GL)
+Name[nn]=Rom (GL)
+Name[pl]=Euforia (GL)
+Name[pt]=Euforia (GL)
+Name[pt_BR]=Euforia (GL)
+Name[ro]=Euforia (GL)
+Name[ru]=Эйфория (GL)
+Name[sl]=Evforija (GL)
+Name[sr]=Еуфорија (GL)
+Name[sr@Latn]=Euforija (GL)
+Name[sv]=Eufori (GL)
+Name[ta]=மகிழ்ச்சி(GL)
+Name[tg]=Кайфчоқӣ (GL)
+Name[th]=ยูโฟเรีย (GL)
+Name[uk]=Ейфорія (GL)
+Name[uz]=Eyforiya (GL)
+Name[uz@cyrillic]=Эйфория (GL)
+Name[vi]=Trạng thái phởn phơ (GL)
+Name[zh_CN]=陶醉(GL)
+
+[Desktop Action Setup]
+Exec=keuphoria.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=keuphoria.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=keuphoria.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KFiresaver.desktop b/kscreensaver/kdesavers/KFiresaver.desktop
new file mode 100644
index 00000000..14946cc9
--- /dev/null
+++ b/kscreensaver/kdesavers/KFiresaver.desktop
@@ -0,0 +1,233 @@
+[Desktop Entry]
+Exec=kfiresaver.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=Fireworks 3D (GL)
+Name[bg]=Фойерверки
+Name[ca]=Focs d'artifici 3D (GL)
+Name[cs]=Ohňostroj (GL)
+Name[de]=Feuerwerk
+Name[el]=Βεγγαλικά (GL)
+Name[es]=Fuegos artificiales 3D (GL)
+Name[et]=Tulevärk 3D (GL)
+Name[eu]=Su artifizialak 3D (GL)
+Name[fa]=آتش‌بازیهای سه بعدی (GL)
+Name[fi]=Ilotulitus 3D (GL)
+Name[fr]=Feux d'artifices 3D (GL)
+Name[fy]=Fjoerwurk 3D (GL)
+Name[ga]=Fireworks 3T (GL)
+Name[gl]=Fogos de artifício 3D (GL)
+Name[he]=זיקוקי דינור (GL)
+Name[hi]=आतिशबाज़ी 3डी (जीएल)
+Name[hu]=Tűzijáték 3D (OpenGL)
+Name[is]=Flugeldar 3D (GL)
+Name[it]=Fuochi d'artificio 3D (GL)
+Name[ja]=花火 3D (GL)
+Name[ka]=ფეიერვერკი (GL)
+Name[mk]=Огномет 3Д (GL)
+Name[nb]=Fyrverkeri 3D (GL)
+Name[nds]=Füerwark (GL)
+Name[ne]=त्रि-आयामिक फाएरवर्क्स (GL)
+Name[nn]=Fyrverkeri 3D (GL)
+Name[pl]=Sztuczne ognie 3D (GL)
+Name[pt]=Fogo de Artifício 3D (GL)
+Name[ro]=Focuri de artificii 3D (GL)
+Name[ru]=Фейерверк (GL)
+Name[sl]=Ognjemet 3D (GL)
+Name[sr]=Ватромети 3Д (GL)
+Name[sr@Latn]=Vatrometi 3D (GL)
+Name[sv]=Fyrverkeri 3D (GL)
+Name[tg]=Оташи тарф (GL)
+Name[tr]=3B Havai Fişekler (GL)
+Name[uk]=Феєрверк 3D (GL)
+Name[vi]=Pháo hoa 3 chiều (GL)
+Name[zh_CN]=三维烟花(GL)
+Name[zh_TW]=3D 煙火秀 (GL)
+
+[Desktop Action Setup]
+Exec=kfiresaver.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kfiresaver.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kfiresaver.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KFlux.desktop b/kscreensaver/kdesavers/KFlux.desktop
new file mode 100644
index 00000000..a431e385
--- /dev/null
+++ b/kscreensaver/kdesavers/KFlux.desktop
@@ -0,0 +1,224 @@
+[Desktop Entry]
+Exec=kflux.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=Flux (GL)
+Name[bg]=Прилив
+Name[cy]=Dylif (GL)
+Name[de]=Flux
+Name[el]=Ροή (GL)
+Name[es]=Flujo (GL)
+Name[fa]=شار (GL)
+Name[fy]=Fluks (GL)
+Name[gl]=Fluxo (GL)
+Name[he]=שטף (GL)
+Name[hi]=लहर-लहर (जीएल)
+Name[hu]=Flux (OpenGL)
+Name[it]=Flusso (GL)
+Name[ja]=流れ (GL)
+Name[ka]=ფლუქტუაცია (GL)
+Name[mk]=Флукс (GL)
+Name[nb]=Fluks (GL)
+Name[ne]=फ्लक्स (GL)
+Name[nn]=Pulsar (GL)
+Name[pt]=Fluxo (GL)
+Name[pt_BR]=Fluxo (GL)
+Name[ru]=Флуктуации (GL)
+Name[sl]=Pretok (GL)
+Name[sr]=Флукс (GL)
+Name[sr@Latn]=Fluks (GL)
+Name[ta]=மாற்றம்(GL)
+Name[tg]=Флуктуатсияи (GL)
+Name[uk]=Флюксія (GL)
+Name[uz]=Oqim (GL)
+Name[uz@cyrillic]=Оқим (GL)
+Name[vi]=Dòng chảy (GL)
+Name[zh_CN]=流动(GL)
+
+[Desktop Action Setup]
+Exec=kflux.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kflux.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kflux.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KFountain.desktop b/kscreensaver/kdesavers/KFountain.desktop
new file mode 100644
index 00000000..cb9ada0b
--- /dev/null
+++ b/kscreensaver/kdesavers/KFountain.desktop
@@ -0,0 +1,249 @@
+[Desktop Entry]
+Exec=kfountain.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=Particle Fountain (GL)
+Name[af]=Deeltjie Fontein (Gl)
+Name[bg]=Източник на частици
+Name[ca]=Font de partícules (GL)
+Name[cs]=Částicová fontána (GL)
+Name[cy]=Ffynnon Gronyn (GL)
+Name[da]=Partikelbrønd (GL)
+Name[de]=Partikelfontäne
+Name[el]=Σιντριβάνι σωματιδίων (GL)
+Name[eo]=Erofontano
+Name[es]=Fuente de partículas (GL)
+Name[et]=Osakeste Fontään (GL)
+Name[eu]=Partikula iturria (GL)
+Name[fa]=منشأ ذره (GL)
+Name[fi]=Hiukkaslähde (GL)
+Name[fr]=Fontaine de particules (GL)
+Name[fy]=Dieltsjesfontein (GL)
+Name[gl]=Fonte de partículas (GL)
+Name[he]=מזרקת חלקיקים (GL)
+Name[hi]=अणु निर्झर (जीएल)
+Name[hu]=Szökőkút (OpenGL)
+Name[is]=Eindagosbrunnur (GL)
+Name[it]=Fontana di particelle (GL)
+Name[ja]=粒子の泉 (GL)
+Name[ka]=შადრევანი (GL)
+Name[lt]=Dalelių fontanas (GL)
+Name[lv]=Kripatiņu Strūklaka (GL)
+Name[mk]=Фонтана од честички (GL)
+Name[mt]=Funtana ta' partiċelli (GL)
+Name[nb]=Partikkelfontene (GL)
+Name[nds]=Deeltjeblaser (GL)
+Name[ne]=पार्टिकल फाउन्टेन (GL)
+Name[nl]=Deeltjes-fontijn (GL)
+Name[nn]=Partikkelfontene (GL)
+Name[pl]=Fontanna cząstek (GL)
+Name[pt]=Fonte de Partículas (GL)
+Name[pt_BR]=Fonte de Partículas (GL)
+Name[ro]=Fîntînă de particule (GL)
+Name[ru]=Фонтан частиц (GL)
+Name[sk]=Fontána častíc (GL)
+Name[sl]=Vodnjak delcev (GL)
+Name[sr]=Фонтана честица (GL)
+Name[sr@Latn]=Fontana čestica (GL)
+Name[sv]=Partikelfontän (GL)
+Name[ta]=பொருள் ஊற்று (GL)
+Name[tg]=Қисми фаввораи (GL)
+Name[th]=ละอองน้ำ (GL)
+Name[tr]=Parçacık Şelalesi (GL)
+Name[uk]=Фонтан частинок (GL)
+Name[uz]=Zarrachalar favvorasi (GL)
+Name[uz@cyrillic]=Заррачалар фаввораси (GL)
+Name[ven]=Tshisima tsha Zwithu nyana (GL)
+Name[vi]=Đài phun Hạt (GL)
+Name[xh]=Umthombo Womhlaba (GL)
+Name[zh_CN]=粒子喷泉(GL)
+Name[zh_TW]=粒子噴泉 (GL)
+Name[zu]=Ingxenye encane yomfudlana (GL)
+
+[Desktop Action Setup]
+Exec=kfountain.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kfountain.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kfountain.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KGravity.desktop b/kscreensaver/kdesavers/KGravity.desktop
new file mode 100644
index 00000000..16981acd
--- /dev/null
+++ b/kscreensaver/kdesavers/KGravity.desktop
@@ -0,0 +1,253 @@
+[Desktop Entry]
+Exec=kgravity.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=Gravity (GL)
+Name[af]=Gravitasie (Gl)
+Name[bg]=Гравитация
+Name[br]=Dedennerezh (GL)
+Name[ca]=Gravetat (GL)
+Name[cs]=Gravitace (GL)
+Name[cy]=Disgyrchiant (GL)
+Name[da]=Tyngdekraft (GL)
+Name[de]=Schwerkraft
+Name[el]=Βαρύτητα (GL)
+Name[eo]=Gravito
+Name[es]=Gravedad (GL)
+Name[et]=Raskusjõud (GL)
+Name[eu]=Grabitatea (GL)
+Name[fa]=جاذبه (GL)
+Name[fi]=Gravitaatio (GL)
+Name[fo]=Tyngd (GL)
+Name[fr]=Gravité (GL)
+Name[fy]=Swiertekrêft (GL)
+Name[gl]=Gravidade (GL)
+Name[he]=חלקיקים (GL)
+Name[hi]=गुरूत्व (जीएल)
+Name[hu]=Gravitáció (OpenGL)
+Name[is]=Þyngdarafl (GL)
+Name[it]=Gravità (GL)
+Name[ja]=重力 (GL)
+Name[ka]=მიზიდულობა (GL)
+Name[lt]=Trauka (GL)
+Name[lv]=Gravitācija (GL)
+Name[mk]=Гравитација (GL)
+Name[ms]=Graviti (GL)
+Name[mt]=Gravità (GL)
+Name[nb]=Gravitasjon (GL)
+Name[nds]=Swoorkraft (GL)
+Name[ne]=गुरुत्व (GL)
+Name[nl]=Zwaartekracht (GL)
+Name[nn]=Tyngdekraft (GL)
+Name[pl]=Grawitacja (GL)
+Name[pt]=Gravidade (GL)
+Name[pt_BR]=Gravidade (GL)
+Name[ro]=Gravitaţie (GL)
+Name[ru]=Гравитация (GL)
+Name[sk]=Gravitácia (GL)
+Name[sl]=Gravitacija (GL)
+Name[sr]=Гравитација (GL)
+Name[sr@Latn]=Gravitacija (GL)
+Name[sv]=Gravitation (GL)
+Name[ta]=புவியிர்ப்பு(GL)
+Name[tg]=Ҷозибаи (GL)
+Name[th]=แรงดึงดูด (GL)
+Name[tr]=Yerçekimi (GL)
+Name[uk]=Гравітація (GL)
+Name[uz]=Gravitatsiya (GL)
+Name[uz@cyrillic]=Гравитация (GL)
+Name[ven]=Fhasi Mavuni (GL)
+Name[vi]=Trọng trường (GL)
+Name[xh]=Umoya otsala izinto kumbindi womhlaba (GL)
+Name[zh_CN]=重力(GL)
+Name[zh_TW]=重力 (GL)
+Name[zu]=Amandla adonsela emhlabeni (GL)
+
+
+[Desktop Action Setup]
+Exec=kgravity.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kgravity.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kgravity.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KLines-saver.desktop b/kscreensaver/kdesavers/KLines-saver.desktop
new file mode 100644
index 00000000..1f5f6e99
--- /dev/null
+++ b/kscreensaver/kdesavers/KLines-saver.desktop
@@ -0,0 +1,255 @@
+[Desktop Entry]
+Exec=klines.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Flying Things
+Name=Lines
+Name[af]=Lyne
+Name[bg]=Линии
+Name[br]=Linennoù
+Name[ca]=Línies
+Name[cs]=Linie
+Name[cy]=Llinellau
+Name[da]=Linjer
+Name[de]=Linien
+Name[el]=Γραμμές
+Name[eo]=Linioj
+Name[es]=Líneas
+Name[et]=Jooned
+Name[eu]=Lerroak
+Name[fa]=خطوط
+Name[fi]=Viivat
+Name[fo]=Reglur
+Name[fr]=Lignes
+Name[fy]=Linen
+Name[ga]=Línte
+Name[gl]=Liñas
+Name[he]=קווים
+Name[hi]= लकीरें
+Name[hu]=Vonalak
+Name[is]=Línur
+Name[it]=Linee
+Name[ja]=線
+Name[ka]=წრფეები
+Name[lt]=Linijos
+Name[lv]=Līnijas
+Name[mk]=Прави
+Name[ms]=Baris
+Name[mt]=Linji
+Name[nb]=Linjer
+Name[nds]=Lienen
+Name[ne]=पङ्क्ति
+Name[nl]=Lijnen
+Name[nn]=Linjer
+Name[nso]=Methalo
+Name[pa]=ਰੇਖਾਵਾਂ
+Name[pl]=Linie
+Name[pt]=Linhas
+Name[pt_BR]=Linhas
+Name[ro]=Linii
+Name[ru]=Линии
+Name[sk]=Čiary
+Name[sl]=Črte
+Name[sr]=Линије
+Name[sr@Latn]=Linije
+Name[sv]=Linjer
+Name[ta]=கம்பிகள்
+Name[tg]=Рахҳо
+Name[th]=เส้น
+Name[tr]=Çizgiler
+Name[uk]=Лінії
+Name[uz]=Chiziqlar
+Name[uz@cyrillic]=Чизиқлар
+Name[ven]=Mitalo
+Name[vi]=Dòng kẻ
+Name[xh]=Iilayini
+Name[zh_CN]=线条
+Name[zh_TW]=線條
+Name[zu]=Olayini
+
+[Desktop Action Setup]
+Exec=klines.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=klines.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=klines.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
+X-DCOP-ServiceType=Multi
diff --git a/kscreensaver/kdesavers/KLorenz.desktop b/kscreensaver/kdesavers/KLorenz.desktop
new file mode 100644
index 00000000..e8a94651
--- /dev/null
+++ b/kscreensaver/kdesavers/KLorenz.desktop
@@ -0,0 +1,244 @@
+[Desktop Entry]
+Exec=klorenz.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Gadgets & Simulations
+Name=Lorenz Attractor
+Name[af]=Lorenz Aantrekker
+Name[bg]=Лоренцо
+Name[br]=Dedenner Lorenz
+Name[cs]=Lorenzův atraktor
+Name[cy]=Attynydd Lorenz
+Name[da]=Lorenz-attraktor
+Name[de]=Lorenz-Attraktor
+Name[el]=Ελκυστής Lorenz
+Name[eo]=Lorenza atraktoro
+Name[es]=Atractor de Lorenz
+Name[et]=Lorenzi atraktor
+Name[eu]=Lorenz erakarlea
+Name[fa]=ربایندۀ Lorenz
+Name[fi]=Lorentz attraktori
+Name[fo]=Lorenz attractor
+Name[fr]=Attracteur de Lorentz
+Name[fy]=Lorenz Oanlûker
+Name[gl]=Atractor Caótico de Lorenz
+Name[he]=מושך לורנץ
+Name[hi]=आठ एकम आठ
+Name[hu]=Lorenz-féle képernyővédő
+Name[is]=Lorenz aðdráttur
+Name[it]=Attrattore di Lorenz
+Name[ja]=ローレンツアトラクタ
+Name[ka]=ლორენცის მიზიდულობა
+Name[lv]=Lorensa Attraktors
+Name[mk]=Лоренцов атрактор
+Name[mt]=Attrattur Lorenz
+Name[nb]=Lorenz-attraktor
+Name[nds]=Lorenz-Antrecker
+Name[ne]=लरेन्ज आकर्षक
+Name[nn]=Lorenz-tiltrekking
+Name[pl]=Atraktor Lorenza
+Name[pt]=Força de Lorenz
+Name[pt_BR]=Atração Lorenz
+Name[ro]=Atracţie Lorenz
+Name[ru]=Странный аттрактор Лоренца
+Name[sl]=Lorenzov atraktor
+Name[sr]=Лоренцов атрактор
+Name[sr@Latn]=Lorencov atraktor
+Name[sv]=Lorenz attraktor
+Name[ta]=லோரன்ஸ் கவர்பவர்
+Name[tg]=Аттракти аҷоиби Лоренс
+Name[th]=สิ่งที่น่าดึงดูดของลอเรนซ์
+Name[tr]=Cazibe
+Name[uk]=Притягнення Лоренца
+Name[ven]=Tshikokodzi tsha Lorenz
+Name[vi]=Điểm hút Lorenz
+Name[xh]=Umtsali we Lorenz
+Name[zh_CN]=洛仑兹吸引子
+Name[zh_TW]=Lorenz 吸引者
+Name[zu]=Umhehi we-Lorenz
+
+[Desktop Action Setup]
+Exec=klorenz.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=klorenz.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=klorenz.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KPendulum.desktop b/kscreensaver/kdesavers/KPendulum.desktop
new file mode 100644
index 00000000..0361dea2
--- /dev/null
+++ b/kscreensaver/kdesavers/KPendulum.desktop
@@ -0,0 +1,221 @@
+[Desktop Entry]
+Exec=kpendulum.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=KPendulum (GL)
+Name[bg]=Махало
+Name[cs]=Kyvadlo
+Name[de]=KPendulum
+Name[el]=Εκκρεμές (GL)
+Name[fr]=Pendule (GL)
+Name[hi]=के-पेंडुलम (जीएल)
+Name[hu]=KPendulum (OpenGL)
+Name[is]=Pendúlar (GL)
+Name[it]=KPendolo (GL)
+Name[ja]=振り子 (GL)
+Name[ka]=ქანქარა (GL)
+Name[mk]=КНишало (GL)
+Name[nb]=KPendel (GL)
+Name[nds]=Pennel (GL)
+Name[ne]=केडीई पेन्डुलम (GL)
+Name[nn]=KPendel (GL)
+Name[pt]=KPêndulo (GL)
+Name[ro]=Pendul (GL)
+Name[ru]=Маятник (GL)
+Name[sl]=KNihalo (GL)
+Name[sr]=К-клатно (GL)
+Name[sr@Latn]=K-klatno (GL)
+Name[sv]=Pendel (GL)
+Name[ta]=KPendulum(GL)
+Name[tg]=Раққосак (GL)
+Name[tr]=Sarkaç (GL)
+Name[uk]=Маятник (GL)
+Name[vi]=Con lắc (GL)
+
+[Desktop Action Setup]
+Exec=kpendulum.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kpendulum.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kpendulum.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KPolygon.desktop b/kscreensaver/kdesavers/KPolygon.desktop
new file mode 100644
index 00000000..62c86869
--- /dev/null
+++ b/kscreensaver/kdesavers/KPolygon.desktop
@@ -0,0 +1,251 @@
+[Desktop Entry]
+Exec=kpolygon.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Rapid Motion
+Name=Polygons
+Name[af]=Poligone
+Name[bg]=Полигон
+Name[br]=Lieskognegoù
+Name[ca]=Polígons
+Name[cs]=Polygony
+Name[cy]=Polygonau
+Name[da]=Polygoner
+Name[de]=Polygon
+Name[el]=Πολύγωνα
+Name[eo]=Poligonoj
+Name[es]=Polígonos
+Name[et]=Polügoonid
+Name[eu]=Poligonoak
+Name[fa]=چند ضلعیها
+Name[fi]=Polygonit
+Name[fo]=Fleirhyrntir
+Name[fr]=Polygones
+Name[fy]=Polygoanen
+Name[ga]=Polagáin
+Name[gl]=Polígonos
+Name[he]=מצולעים
+Name[hi]=बहुभुज
+Name[hu]=Poligonok
+Name[is]=Marghyrningar
+Name[it]=Poligoni
+Name[ja]=ポリゴン
+Name[ka]=მრავალკუთხედები
+Name[lt]=Daugiakampiai
+Name[lv]=Poligoni
+Name[mk]=Полигони
+Name[ms]=Poligon
+Name[mt]=Poligoni
+Name[nb]=Polygoner
+Name[nds]=Veelecks
+Name[ne]=बहुभुज
+Name[nl]=Polygonen
+Name[nn]=Polygon
+Name[pa]=ਬਹੁਭੁਜ
+Name[pl]=Wielokąty
+Name[pt]=Polígonos
+Name[pt_BR]=Polígonos
+Name[ro]=Poligoane
+Name[ru]=Многоугольники
+Name[sk]=Polygóny
+Name[sl]=Mnogokotniki
+Name[sr]=Полигони
+Name[sr@Latn]=Poligoni
+Name[sv]=Polygoner
+Name[ta]=பலகோணவடிவங்கள்
+Name[tg]=Бисёркунҷа
+Name[th]=รูปหลายเหลี่ยม
+Name[tr]=Poligonlar
+Name[uk]=Багатокутники
+Name[uz]=Koʻpburchaklar
+Name[uz@cyrillic]=Кўпбурчаклар
+Name[vi]=Đa giác
+Name[xh]=Iziqu ezinekona namacala amaninzi
+Name[zh_CN]=多边形
+Name[zh_TW]=多邊形
+
+[Desktop Action Setup]
+Exec=kpolygon.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kpolygon.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kpolygon.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KRotation.desktop b/kscreensaver/kdesavers/KRotation.desktop
new file mode 100644
index 00000000..9ec61439
--- /dev/null
+++ b/kscreensaver/kdesavers/KRotation.desktop
@@ -0,0 +1,221 @@
+[Desktop Entry]
+Exec=krotation.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=KRotation (GL)
+Name[bg]=Ротация
+Name[cs]=Rotace
+Name[de]=KRotation
+Name[el]=Ατλαντίδα (GL)
+Name[fr]=Rotation (GL)
+Name[fy]=KRotaasje (GL)
+Name[he]= KRotation(GL)
+Name[hi]=के-रोटेशन (जीएल)
+Name[hu]=KRotation (OpenGL)
+Name[is]=Ksnúningur (GL)
+Name[it]=KRotazione (GL)
+Name[ja]=回転 (GL)
+Name[ka]=დატრიალება (GL)
+Name[mk]=КРотација (GL)
+Name[nb]=KRotasjon (GL)
+Name[ne]=केडीई परिक्रमण (GL)
+Name[nn]=KRotasjon (GL)
+Name[pt]=KRotação (GL)
+Name[ro]=Rotire (GL)
+Name[ru]=Вращение (GL)
+Name[sl]=KRotacija (GL)
+Name[sr]=К-ротација (GL)
+Name[sr@Latn]=K-rotacija (GL)
+Name[sv]=Rotation (GL)
+Name[tg]=Тобхурӣ (GL)
+Name[tr]=Döndürme (GL)
+Name[uk]=Обертання (GL)
+Name[vi]=Xoay (GL)
+
+[Desktop Action Setup]
+Exec=krotation.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=krotation.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=krotation.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KScience.desktop b/kscreensaver/kdesavers/KScience.desktop
new file mode 100644
index 00000000..4b4c9dfd
--- /dev/null
+++ b/kscreensaver/kdesavers/KScience.desktop
@@ -0,0 +1,254 @@
+[Desktop Entry]
+Exec=kscience.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Desktop Distortions
+X-KDE-Type=ManipulateScreen
+Name=Science
+Name[af]=Wetenskap
+Name[bg]=Наука
+Name[br]=Skiantoù
+Name[ca]=Ciència
+Name[cs]=Věda
+Name[cy]=Gwyddoniaeth
+Name[da]=Videnskab
+Name[de]=Wissenschaft
+Name[el]=Επιστήμη
+Name[eo]=Scienco
+Name[es]=Ciencia
+Name[et]=Teadus
+Name[eu]=Zientzia
+Name[fa]=علم
+Name[fi]=Linssi
+Name[fo]=Náttúruvísind
+Name[fy]=Wittenskiplik
+Name[ga]=Eolaíocht
+Name[gl]=Ciéncia
+Name[he]=מדע
+Name[hi]=विज्ञान
+Name[hu]=Tudomány
+Name[is]=Vísindi
+Name[it]=Scienza
+Name[ja]=サイエンス
+Name[ka]=მეცნიერება
+Name[lt]=Mokslas
+Name[lv]=Zinātne
+Name[mk]=Наука
+Name[ms]=Sains
+Name[mt]=Xjenza
+Name[nb]=Vitenskap
+Name[nds]=Wetenschap
+Name[ne]=बिज्ञान
+Name[nl]=Wetenschappelijk
+Name[nn]=Vitskap
+Name[nso]=Mahlale
+Name[pa]=ਵਿਗਿਆਨ
+Name[pl]=Nauka
+Name[pt]=Ciência
+Name[pt_BR]=Ciência
+Name[ro]=Ştiinţă
+Name[ru]=Наука
+Name[sk]=Vedecký
+Name[sl]=Znanost
+Name[sr]=Наука
+Name[sr@Latn]=Nauka
+Name[sv]=Vetenskap
+Name[ta]=அறிவியல்
+Name[tg]=Илм
+Name[th]=วิทยาศาสตร์
+Name[tr]=Bilim
+Name[uk]=Наука
+Name[uz]=Fan
+Name[uz@cyrillic]=Фан
+Name[ven]=Vhutsila
+Name[vi]=Khoa học
+Name[xh]=Inzulu lwazi
+Name[zh_CN]=科学
+Name[zh_TW]=科學
+Name[zu]=Ubuchwepheshe bezesayensi
+
+[Desktop Action Setup]
+Exec=kscience.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kscience.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kscience.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KSlideshow.desktop b/kscreensaver/kdesavers/KSlideshow.desktop
new file mode 100644
index 00000000..3edb75da
--- /dev/null
+++ b/kscreensaver/kdesavers/KSlideshow.desktop
@@ -0,0 +1,251 @@
+[Desktop Entry]
+Exec=kslideshow.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Banners & Pictures
+Name=Slide Show
+Name[af]=Skuif Vertoon
+Name[bg]=Слайдшоу
+Name[br]=Diskouezadur skeudennoù
+Name[ca]=Diapositives
+Name[cs]=Promítání
+Name[cy]=Sioe Tryloywder
+Name[da]=Diasshow
+Name[de]=Dia-Schau
+Name[el]=Προβολή σλάιντς
+Name[eo]=Lumbildoj
+Name[es]=Presentación
+Name[et]=Slaidishow
+Name[eu]=Diapositiba erakusketa
+Name[fa]=نمایش اسلاید
+Name[fi]=Diaesitys
+Name[fo]=Framløga
+Name[fr]=Diaporama
+Name[fy]=Diafoarstelling
+Name[ga]=Taispeántas Sleamhnán
+Name[gl]=Apresentación
+Name[he]=מצגת שקופיות
+Name[hi]=झलक तमाशा
+Name[hu]=Diavetítés
+Name[is]=Skyggnusýning
+Name[it]=Immagini in sequenza
+Name[ja]=スライドショー
+Name[ka]=სლაიდების ჩვენება
+Name[lt]=Skaidrių šou
+Name[lv]=Slīdrāde
+Name[mk]=Слајд-шоу
+Name[ms]=Tayangan Slaid
+Name[nb]=Lysbildeshow
+Name[nds]=Diaschau
+Name[ne]=स्लाइड प्रदर्शन
+Name[nl]=Diavoorstelling
+Name[nn]=Framvising
+Name[pl]=Sekwencja slajdów
+Name[pt]=Slides
+Name[pt_BR]=Show de slides
+Name[ro]=Succesiune de imagini
+Name[ru]=Слайд-шоу
+Name[sl]=Diapozitivi
+Name[sr]=Слајд шоу
+Name[sr@Latn]=Slajd šou
+Name[sv]=Bildspel
+Name[ta]=ஸ்லைடு காட்சி
+Name[tg]=Намоиши слайд
+Name[th]=แสดงภาพนิ่ง
+Name[tr]=Saydam Gösterisi
+Name[uk]=Слайди
+Name[uz]=Slayd shou
+Name[uz@cyrillic]=Слайд шоу
+Name[ven]=Musumbedzo wo peamaho
+Name[vi]=Trình bày
+Name[xh]=Isiboniso esihamba thambileyo
+Name[zh_CN]=幻灯播放
+Name[zh_TW]=幻燈片放映
+Name[zu]=Isiboniso esihamba ngokuthambile
+
+[Desktop Action Setup]
+Exec=kslideshow.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kslideshow.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kslideshow.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
+
diff --git a/kscreensaver/kdesavers/KSolarWinds.desktop b/kscreensaver/kdesavers/KSolarWinds.desktop
new file mode 100644
index 00000000..fafbe5a9
--- /dev/null
+++ b/kscreensaver/kdesavers/KSolarWinds.desktop
@@ -0,0 +1,243 @@
+[Desktop Entry]
+Exec=ksolarwinds.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=Solar Winds (GL)
+Name[bg]=Слънчев вятър
+Name[br]=Avelioù an Heol (GL)
+Name[ca]=Vent solar (GL)
+Name[cy]=Gwyntoedd o'r Haul (GL)
+Name[da]=Solvinde (GL)
+Name[de]=Sonnenwind
+Name[el]=Αστρικοί Άνεμοι (GL)
+Name[es]=Viento solar (GL)
+Name[et]=Päikesetuul (GL)
+Name[eu]=Eguzki-haizeak (GL)
+Name[fa]=پیچشهای خورشیدی (GL)
+Name[fi]=Aurinkotuuli (GL)
+Name[fo]=Sólvind (GL)
+Name[fr]=Vents solaires (GL)
+Name[fy]=Sinnewyn (GL)
+Name[gl]=Vento solar (GL)
+Name[he]=רוחות סולאריות (GL)
+Name[hi]=सौर तूफ़ान (जीएल)
+Name[hu]=Napszél (OpenGL)
+Name[is]=Sólvindar (GL)
+Name[it]=Venti Solari (GL)
+Name[ja]=太陽風 (GL)
+Name[ka]=მზის ქარი (GL)
+Name[mk]=Соларни ветрови (GL)
+Name[mt]=Irjieħ solari (GL)
+Name[nb]=Solvind (GL)
+Name[nds]=Sünnwind
+Name[ne]=सौर्य हावा (GL)
+Name[nl]=Zonnewind (GL)
+Name[nn]=Solvind (GL)
+Name[pl]=Wiatry słoneczne (GL)
+Name[pt]=Ventos Solares (GL)
+Name[pt_BR]=Ventos Solares (GL)
+Name[ro]=Vînturi solare (GL)
+Name[ru]=Солнечный ветер (GL)
+Name[sl]=Solarni vetrovi (GL)
+Name[sr]=Соларни ветрови (GL)
+Name[sr@Latn]=Solarni vetrovi (GL)
+Name[sv]=Solvindar (GL)
+Name[ta]=சூரிய காற்றுக்கள்(GL)
+Name[tg]=Шамоли офтобӣ (GL)
+Name[th]=สายลมสุริยะ (GL)
+Name[tr]=Güneş Rüzgarı (GL)
+Name[uk]=Сонячні вітри (GL)
+Name[uz]=Quyosh shamollari (GL)
+Name[uz@cyrillic]=Қуёш шамоллари (GL)
+Name[ven]=Mimuya yau solar (GL)
+Name[vi]=Gió Mặt Trời (GL)
+Name[zh_CN]=太阳风(GL)
+Name[zu]=Imimoya Yelanga (GL)
+
+[Desktop Action Setup]
+Exec=ksolarwinds.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=ksolarwinds.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=ksolarwinds.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KVm.desktop b/kscreensaver/kdesavers/KVm.desktop
new file mode 100644
index 00000000..c30d8014
--- /dev/null
+++ b/kscreensaver/kdesavers/KVm.desktop
@@ -0,0 +1,253 @@
+[Desktop Entry]
+Exec=kvm.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Gadgets & Simulations
+Name=Virtual Machine
+Name[af]=Virtuele Masjien
+Name[bg]=Виртуална машина
+Name[br]=Ardivink galloudel
+Name[ca]=Màquina virtual
+Name[cs]=Virtuální stroj
+Name[cy]=Peiriant Rhith
+Name[da]=Virtuel maskine
+Name[de]=Virtuelle Maschine
+Name[el]=Εικονική μηχανή
+Name[eo]=Virtuala Maŝino
+Name[es]=Máquina virtual
+Name[et]=Virtuaalne Masin
+Name[eu]=Makina birtuala
+Name[fa]=ماشین مجازی
+Name[fi]=Virtuaalikone
+Name[fo]=Tyknismaskina
+Name[fr]=Machine virtuelle
+Name[fy]=Firtuele masine
+Name[ga]=Meaisín Fíorúil
+Name[gl]=Máquina virtual
+Name[he]=מכונה וירטואלית
+Name[hi]=आभासी यंत्र
+Name[hu]=Virtuális gép
+Name[is]=Sýndarvél
+Name[it]=Macchina virtuale
+Name[ja]=仮想マシン
+Name[ka]=ვირტუალური მანქანა
+Name[lt]=Virtuali Mašina
+Name[lv]=Virtuālā mašīna
+Name[mk]=Виртуелна машина
+Name[ms]=Mesin Maya
+Name[mt]=Magna Virtwali
+Name[nb]=Virtuell maskin
+Name[nds]=Virtuell Maschien
+Name[ne]=अवास्तविक मेशिन
+Name[nl]=Virtuele machine
+Name[nn]=Virtuell maskin
+Name[nso]=Motshene o Maatla
+Name[pl]=Maszyna wirtualna
+Name[pt]=Máquina Virtual
+Name[pt_BR]=Máquina virtual
+Name[ro]=Maşină virtuală
+Name[ru]=Виртуальная машина
+Name[sk]=Virtuálny stroj
+Name[sl]=Navidezni stroj
+Name[sr]=Виртуелна машина
+Name[sr@Latn]=Virtuelna mašina
+Name[sv]=Virtuell maskin
+Name[ta]=கற்பனை வாகனம்
+Name[tg]=Мошини уфуқӣ
+Name[th]=เครื่องจำลอง
+Name[tr]=Sanal Makine
+Name[uk]=Віртуальна машина
+Name[uz]=Virtual kompyuter
+Name[uz@cyrillic]=Виртуал компьютер
+Name[ven]=Mutshini usa vhonali
+Name[vi]=Máy Ảo
+Name[xh]=Umatshini onesiqhamo
+Name[zh_CN]=虚拟机
+Name[zh_TW]=虛擬機器
+Name[zu]=Ushini Obonakalayo
+
+[Desktop Action Setup]
+Exec=kvm.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kvm.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kvm.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/KWave.desktop b/kscreensaver/kdesavers/KWave.desktop
new file mode 100644
index 00000000..3b7093d2
--- /dev/null
+++ b/kscreensaver/kdesavers/KWave.desktop
@@ -0,0 +1,251 @@
+[Desktop Entry]
+Exec=kwave.kss
+Icon=kscreensaver
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Type=OpenGL
+Name=Bitmap Flag (GL)
+Name[af]=Biskaart Vlag (Gl)
+Name[bg]=Развяващ се флаг
+Name[ca]=Bandera de mapa de bits (GL)
+Name[cs]=Vlajka (GL)
+Name[cy]=Baner Didfap (GL)
+Name[da]=Bitmapflag (GL)
+Name[de]=Bildflagge
+Name[el]=Σημαία bitmap (GL)
+Name[eo]=Bildflago
+Name[es]=Bandera de mapa de bits (GL)
+Name[et]=Pildilipp (GL)
+Name[eu]=Bitmap Bandera (GL)
+Name[fa]=پرچم نگاشت بیت(GL)
+Name[fi]=Bittikarttalippu (GL)
+Name[fo]=Flagg (GL)
+Name[fr]=Drapeau (GL)
+Name[fy]=Bitmap flagge (GL)
+Name[gl]=Bandeira de mapa de bits (GL)
+Name[he]=דגל (GL)
+Name[hi]=झंडियाँ (जीएल)
+Name[hu]=Zászló (OpenGL)
+Name[is]=Myndafáni (GL)
+Name[it]=Bandiera bitmap (GL)
+Name[ja]=ビットマップフラッグ (GL)
+Name[ka]=რასტრული ალამი (GL)
+Name[lt]=Taškinės grafikos (bitmap) vėliava (GL)
+Name[lv]=Bitmapa Karogs (GL)
+Name[mk]=Битмапирано знаме (GL)
+Name[mt]=Bandiera bi stampa (GL)
+Name[nb]=Bittmap-flagg (GL)
+Name[nds]=Weihen Flagg (GL)
+Name[ne]=बिटम्याप झण्डा(GL)
+Name[nl]=Bitmap vlag (GL)
+Name[nn]=Flagg (GL)
+Name[pl]=Bitmapowa flaga (GL)
+Name[pt]=Imagem Ondulante (GL)
+Name[pt_BR]=Bitmap (GL)
+Name[ro]=Steag imagine (GL)
+Name[ru]=Растровый флаг (GL)
+Name[sk]=alajka (GL)
+Name[sl]=Bitna zastava (GL)
+Name[sr]=Битмапирана застава (GL)
+Name[sr@Latn]=Bitmapirana zastava (GL)
+Name[sv]=Bitmappsflagga (GL)
+Name[ta]=பிட்வரைப்பட குறி
+Name[tg]=Байрақи растрӣ (GL)
+Name[th]=ธงภาพบิตแมพ (GL)
+Name[tr]=Bayrak (GL)
+Name[uk]=Растровий прапор (GL)
+Name[uz]=Bayroq (GL)
+Name[uz@cyrillic]=Байроқ (GL)
+Name[ven]=Fulaga ya Bitmap (GL)
+Name[vi]=Cờ Mảng ảnh (GL)
+Name[xh]=Indwe ye Bitmap (GL)
+Name[zh_CN]=位图旗帜(GL)
+Name[zh_TW]=點陣圖旗幟 (GL)
+Name[zu]=Bitmap Flap (GL)
+
+
+[Desktop Action Setup]
+Exec=kwave.kss -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[bg]=Настройки...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Arranjament...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=Ρύθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistamine...
+Name[eu]=Konfiguratu...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fo]=Uppseting...
+Name[fr]=Configuration...
+Name[fy]=Opset...
+Name[ga]=Cumraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hu]=Beállítás...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=設定...
+Name[ka]=გამართვა...
+Name[lt]=Sąranka ...
+Name[lv]=Uzstādīšana...
+Name[mk]=Поставување...
+Name[ms]=Setkan...
+Name[mt]=Konfigurazzjoni...
+Name[nb]=Innstillinger …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[nso]=Beakanya...
+Name[pa]=ਸੈਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setează...
+Name[ru]=Настройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavi ...
+Name[sr]=Подеси...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைப்பு...
+Name[tg]=Барпосозӣ...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Встановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[vi]=Thiết lập...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=kwave.kss -window-id %w
+Name=Display in Specified Window
+Name[bg]=Стартиране в избран прозорец
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v určeném okně
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In bestimmten Fenster anzeigen
+Name[el]=Προβολή στο καθορισμένο παράθυρο
+Name[eo]=Montri en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Bistaratu zehaztutako lehioan
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre spécifiée
+Name[fy]=Werjefte yn in definiearre finster
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצוין
+Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a megadott ablakban
+Name[is]=Birta í völdum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=特定のウィンドウで表示
+Name[ka]=ჩვენება მითითებულ ფანჯარაში
+Name[lt]=Rodyti nurodytame lange
+Name[mk]=Прикажи во наведениот прозорец
+Name[ms]=Papar dalam Tetingkap Yang Dinyatakan
+Name[nb]=Vis i angitt vindu
+Name[nds]=In utsöcht Finster wiesen
+Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in een opgegeven venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v določenemu oknu
+Name[sr]=Прикажи у наведеном прозору
+Name[sr@Latn]=Prikaži u navedenom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]=குறித்த சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи нишондода намоиш намоед
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[vi]=Hiển thị trong Cửa sổ Đã định
+Name[zh_CN]=在指定的窗口中显示
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=kwave.kss -root
+Name=Display in Root Window
+Name[bg]=Стартиране в главния прозорец
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=In Hintergrundfenster anzeigen
+Name[el]=Προβολή στο βασικό παράθυρο
+Name[eo]=Montri en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Bistaratu erro lehioan
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre racine
+Name[fy]=Werjefte yn haadfinster
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hi]=रूट विंडो में प्रदर्शित करें
+Name[hu]=Megjelenítés a gyökérablakban
+Name[is]=Birta í rótarglugganum
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウで表示
+Name[ka]=ჩვენება ძირითად ფანჯარაში
+Name[lt]=Rodyti root lange
+Name[mk]=Прикажи во коренскиот прозорец
+Name[ms]=Papar dalam Tetingkap Root
+Name[nb]=Vis i root-vindu
+Name[nds]=In Hööftfinster wiesen
+Name[ne]=मूल सञ्झ्यालमा प्रदर्शन
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать в корневом окне
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у главном (root) прозору
+Name[sr@Latn]=Prikaži u glavnom (root) prozoru
+Name[sv]=Visa i rotfönstret
+Name[ta]=ஆரம்ப சாளரத்தில் காட்டு
+Name[tg]=Дар тирезаи решагӣ намоиш намоед
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити в кореневому вікні
+Name[vi]=Hiển thị trong Cửa sổ Gốc
+Name[zh_CN]=在根窗口中显示
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
diff --git a/kscreensaver/kdesavers/Makefile.am b/kscreensaver/kdesavers/Makefile.am
new file mode 100644
index 00000000..8f399401
--- /dev/null
+++ b/kscreensaver/kdesavers/Makefile.am
@@ -0,0 +1,102 @@
+# $Id$
+# Makefile.am for kscreensaver.
+#
+
+SUBDIRS = . data
+
+AM_CPPFLAGS = -UQT_NO_ASCII_CAST
+
+INCLUDES = $(all_includes) $(GLINC) $(LIBART_CFLAGS)
+AM_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+AM_LDADD = $(LIB_KDEUI) -lkscreensaver
+
+if COMPILE_X11_KSAVERS
+X11_KSAVERS = kscience.kss
+X11_DESKTOP_FILES = KScience.desktop
+endif
+
+if COMPILE_LIBART_KSAVERS
+LIBART_KSAVERS = kclock.kss
+LIBART_DESKTOP_FILES = KClock.desktop
+endif
+LIBART_KSAVERS_LDADD = $(AM_LDADD) $(LIBART_LIBS)
+
+if COMPILE_ARTS_GL_KSAVERS
+ARTS_GL_KSAVERS = kfiresaver.kss
+ARTS_GL_DESKTOP_FILES = KFiresaver.desktop
+endif
+
+if COMPILE_GL_KSAVERS
+GL_KSAVERS=kfountain.kss kwave.kss kgravity.kss kflux.kss keuphoria.kss ksolarwinds.kss krotation.kss kpendulum.kss
+GL_DESKTOP_FILES=KGravity.desktop KWave.desktop KFountain.desktop KFlux.desktop KEuphoria.desktop KSolarWinds.desktop KRotation.desktop KPendulum.desktop
+endif
+GL_KSAVERS_LDADD = $(AM_LDADD) $(GLLIB)
+
+bin_PROGRAMS = kbanner.kss kpolygon.kss kslideshow.kss \
+ klines.kss klorenz.kss kblob.kss kvm.kss \
+ $(X11_KSAVERS) $(LIBART_KSAVERS) $(ARTS_GL_KSAVERS) $(GL_KSAVERS)
+
+# The "normal" screensavers
+kbanner_kss_SOURCES = banner.cpp
+kbanner_kss_LDADD = $(AM_LDADD)
+kpolygon_kss_SOURCES = polygon.cpp
+kpolygon_kss_LDADD = $(AM_LDADD)
+kslideshow_kss_SOURCES = slideshow.cpp slideshowcfg.ui
+kslideshow_kss_LDADD = $(LIB_KFILE) $(AM_LDADD) $(LIB_KSYCOCA) -lm
+klines_kss_SOURCES = lines.cpp
+klines_kss_LDADD = $(AM_LDADD)
+klorenz_kss_SOURCES = lorenz.cpp
+klorenz_kss_LDADD = $(AM_LDADD) -lm
+kblob_kss_SOURCES = blob.cpp
+kblob_kss_LDADD = $(AM_LDADD) -lm
+kvm_kss_SOURCES = kvm.cpp vm.c vm_random.c
+kvm_kss_LDADD = $(AM_LDADD)
+kscience_kss_SOURCES = science.cpp
+kscience_kss_LDADD = $(AM_LDADD) -lm
+
+# The GL screensavers
+kfountain_kss_SOURCES = fountain.cpp fountaincfg.ui
+kfountain_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+kwave_kss_SOURCES = wave.cpp wavecfg.ui
+kwave_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+kgravity_kss_SOURCES = gravity.cpp gravitycfg.ui
+kgravity_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+kflux_kss_SOURCES = Flux.cpp
+kflux_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+keuphoria_kss_SOURCES = Euphoria.cpp
+keuphoria_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+ksolarwinds_kss_SOURCES = SolarWinds.cpp
+ksolarwinds_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+krotation_kss_SOURCES = rotation.cpp rotationcfg.ui sspreviewarea.cpp rkodesolver.cpp vec3.cpp
+krotation_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+kpendulum_kss_SOURCES = pendulum.cpp pendulumcfg.ui sspreviewarea.cpp rkodesolver.cpp
+kpendulum_kss_LDADD = $(GL_KSAVERS_LDADD) -lm
+kfiresaver_kss_SOURCES = firesaversetup.ui firesaverparticle.cpp firesaverwriter.cpp firesaver.cpp
+kfiresaver_kss_LDADD = $(GL_KSAVERS_LDADD) -lartskde -lm
+
+# The LIBART screensavers
+kclock_kss_SOURCES = kclock.cpp
+kclock_kss_LDADD = $(LIBART_KSAVERS_LDADD)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = banner.h polygon.h slideshow.h lines.h\
+ lorenz.h blob.h kvm.h vm.h vm_random.h science.h \
+ fountain.h wave.h gravity.h kclock.h\
+ rotation.h pendulum.h sspreviewarea.h rkodesolver.h vec3.h\
+ firesaver.h firesaverparticle.h firesaversetup.ui.h\
+ firesaverwriter.h
+
+########## Meta objects ##########
+
+pics_DATA = kscience.png particle.png image.png
+picsdir = $(kde_datadir)/kscreensaver
+
+desktop_DATA = KBanner.desktop KPolygon.desktop \
+ KSlideshow.desktop KLines-saver.desktop KLorenz.desktop \
+ KBlob.desktop KVm.desktop \
+ KClock.desktop $(X11_DESKTOP_FILES) $(GL_DESKTOP_FILES) $(LIBART_DESKTOP_FILES) $(ARTS_GL_DESKTOP_FILES)
+
+desktopdir = $(kde_appsdir)/System/ScreenSavers
+
+EXTRA_DIST = $(desktop_DATA) vm.xpm vm.xbm kscience.png particle.png image.png
diff --git a/kscreensaver/kdesavers/README b/kscreensaver/kdesavers/README
new file mode 100644
index 00000000..694adefd
--- /dev/null
+++ b/kscreensaver/kdesavers/README
@@ -0,0 +1,3 @@
+These are native KDE screensavers using the libkscreensaver library.
+If you are writing a screensaver for KDE use these as references rather
+than the ported savers.
diff --git a/kscreensaver/kdesavers/SolarWinds.cpp b/kscreensaver/kdesavers/SolarWinds.cpp
new file mode 100644
index 00000000..ee3743c0
--- /dev/null
+++ b/kscreensaver/kdesavers/SolarWinds.cpp
@@ -0,0 +1,778 @@
+//============================================================================
+//
+// Terence Welsh Screensaver - Solar Winds
+// http://www.reallyslick.com/
+//
+// Ported to KDE by Karl Robillard
+//
+/*
+ * Copyright (C) 2002 Terence M. Welsh
+ *
+ * Solar Winds is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Solar Winds is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+//============================================================================
+
+
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <time.h>
+#include <qtimer.h>
+#include "SolarWinds.h"
+#include "SolarWinds.moc"
+
+
+#define NUMCONSTS 9
+#define PIx2 6.28318530718f
+#define DEG2RAD 0.0174532925f
+
+
+// Useful random number macro
+// Don't forget to initialize with srand()
+
+// This is the original myRandf() which does not work on Linux.
+// I grabed the inline version from Flux.cpp.
+//#define myRandf(x) (float(rand()) * (x * 0.0000305185095f))
+
+inline float myRandf(float x){
+ return(float(rand() * x) / float(RAND_MAX));
+}
+
+
+// Context pointer to allow many instances.
+static SWindsWidget* _ec = 0;
+
+
+struct Emitter
+{
+ float x, y, z;
+};
+
+
+struct Particle
+{
+ float x, y, z;
+ float r, g, b;
+};
+
+
+class wind
+{
+public:
+
+ wind();
+ ~wind();
+ void update();
+
+ Emitter* emitters;
+ Particle* particles;
+ int** linelist;
+ int* lastparticle;
+ int whichparticle;
+ int partCount;
+ int emitCount;
+ bool useLines;
+ float c[NUMCONSTS];
+ float ct[NUMCONSTS];
+ float cv[NUMCONSTS];
+};
+
+
+wind::wind()
+{
+ int i;
+
+ partCount = _ec->dParticles;
+ emitCount = _ec->dEmitters;
+ useLines = (_ec->dGeometry == 2);
+
+ emitters = new Emitter[emitCount];
+ for(i=0; i<emitCount; i++)
+ {
+ emitters[i].x = myRandf(60.0f) - 30.0f;
+ emitters[i].y = myRandf(60.0f) - 30.0f;
+ emitters[i].z = myRandf(30.0f) - 15.0f;
+ }
+
+ particles = new Particle[partCount];
+ for(i=0; i<partCount; i++)
+ {
+ particles[i].x = 0.0f;
+ particles[i].y = 0.0f;
+ particles[i].z = 100.0f; // start particles behind viewer
+ }
+
+ whichparticle = 0;
+
+ if( useLines )
+ {
+ linelist = new int*[partCount];
+ for(i=0; i<partCount; i++)
+ {
+ linelist[i] = new int[2];
+ linelist[i][0] = -1;
+ linelist[i][1] = -1;
+ }
+ lastparticle = new int[emitCount];
+ for(i=0; i<emitCount; i++)
+ lastparticle[i] = i;
+ }
+
+ float windspeed = (float) (_ec->dWindspeed);
+ for(i=0; i<NUMCONSTS; i++)
+ {
+ ct[i] = myRandf(PIx2);
+ cv[i] = myRandf(0.00005f * windspeed * windspeed)
+ + 0.00001f * windspeed * windspeed;
+ //printf( "KR ct %g cv %g\n", ct[i], cv[i] );
+ }
+}
+
+
+wind::~wind()
+{
+ delete[] emitters;
+ delete[] particles;
+
+ if( useLines )
+ {
+ int i;
+ for(i=0; i<partCount; i++)
+ delete[] linelist[i];
+ delete[] linelist;
+ delete[] lastparticle;
+ }
+}
+
+
+void wind::update()
+{
+ int i;
+ float x, y, z;
+ float temp;
+ float particleSpeed = (float) _ec->dParticlespeed;
+
+ float evel = float(_ec->dEmitterspeed) * 0.01f;
+ float pvel = particleSpeed * 0.01f;
+ float pointsize = 0.04f * _ec->dSize;
+ float linesize = 0.005f * _ec->dSize;
+
+ // update constants
+ for(i=0; i<NUMCONSTS; i++)
+ {
+ ct[i] += cv[i];
+ if(ct[i] > PIx2)
+ ct[i] -= PIx2;
+ c[i] = cos(ct[i]);
+ }
+
+ // calculate emissions
+ for(i=0; i<emitCount; i++)
+ {
+ emitters[i].z += evel; // emitter moves toward viewer
+ if(emitters[i].z > 15.0f)
+ {
+ // reset emitter
+ emitters[i].x = myRandf(60.0f) - 30.0f;
+ emitters[i].y = myRandf(60.0f) - 30.0f;
+ emitters[i].z = -15.0f;
+ }
+
+ particles[whichparticle].x = emitters[i].x;
+ particles[whichparticle].y = emitters[i].y;
+ particles[whichparticle].z = emitters[i].z;
+
+ if( useLines )
+ {
+ // link particles to form lines
+ if(linelist[whichparticle][0] >= 0)
+ linelist[linelist[whichparticle][0]][1] = -1;
+ linelist[whichparticle][0] = -1;
+ if(emitters[i].z == -15.0f)
+ linelist[whichparticle][1] = -1;
+ else
+ linelist[whichparticle][1] = lastparticle[i];
+ linelist[lastparticle[i]][0] = whichparticle;
+ lastparticle[i] = whichparticle;
+ }
+
+ whichparticle++;
+ if(whichparticle >= partCount)
+ whichparticle = 0;
+ }
+
+ // calculate particle positions and colors
+ // first modify constants that affect colors
+ c[6] *= 9.0f / particleSpeed;
+ c[7] *= 9.0f / particleSpeed;
+ c[8] *= 9.0f / particleSpeed;
+ // then update each particle
+ for(i=0; i<partCount; i++)
+ {
+ Particle* part = particles + i;
+
+ // store old positions
+ x = part->x;
+ y = part->y;
+ z = part->z;
+
+ // make new positins
+ part->x = x + (c[0] * y + c[1] * z) * pvel;
+ part->y = y + (c[2] * z + c[3] * x) * pvel;
+ part->z = z + (c[4] * x + c[5] * y) * pvel;
+
+ // calculate colors
+ part->r = fabs((part->x - x) * c[6]);
+ part->g = fabs((part->y - y) * c[7]);
+ part->b = fabs((part->z - z) * c[8]);
+
+ // clamp colors
+ if( part->r > 1.0f )
+ part->r = 1.0f;
+ if( part->g > 1.0f )
+ part->g = 1.0f;
+ if( part->b > 1.0f )
+ part->b = 1.0f;
+ }
+
+ // draw particles
+ switch(_ec->dGeometry)
+ {
+ case 0: // lights
+ for(i=0; i<partCount; i++)
+ {
+ glColor3fv(&particles[i].r);
+ glPushMatrix();
+ glTranslatef(particles[i].x, particles[i].y, particles[i].z);
+ glCallList(1);
+ glPopMatrix();
+#if 0
+ if( i == 0 )
+ printf( "KR %d %g %g %g\n", i,
+ particles[i].x, particles[i].y, particles[i].z);
+#endif
+ }
+ break;
+
+ case 1: // points
+ for(i=0; i<partCount; i++)
+ {
+ temp = particles[i].z + 40.0f;
+ if(temp < 0.01f)
+ temp = 0.01f;
+ glPointSize(pointsize * temp);
+
+ glBegin(GL_POINTS);
+ glColor3fv(&particles[i].r);
+ glVertex3fv(&particles[i].x);
+ glEnd();
+ }
+ break;
+
+ case 2: // lines
+ for(i=0; i<partCount; i++)
+ {
+ temp = particles[i].z + 40.0f;
+ if(temp < 0.01f)
+ temp = 0.01f;
+ glLineWidth(linesize * temp);
+
+ glBegin(GL_LINES);
+ if(linelist[i][1] >= 0)
+ {
+ glColor3fv(&particles[i].r);
+ if(linelist[i][0] == -1)
+ glColor3f(0.0f, 0.0f, 0.0f);
+ glVertex3fv(&particles[i].x);
+
+ glColor3fv(&particles[linelist[i][1]].r);
+ if(linelist[linelist[i][1]][1] == -1)
+ glColor3f(0.0f, 0.0f, 0.0f);
+ glVertex3fv(&particles[linelist[i][1]].x);
+ }
+ glEnd();
+ }
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+
+SWindsWidget::SWindsWidget( QWidget* parent, const char* name )
+ : QGLWidget(parent, name), _winds(0)
+{
+ setDefaults( Regular );
+
+ _frameTime = 1000 / 60;
+ _timer = new QTimer( this );
+ connect( _timer, SIGNAL(timeout()), this, SLOT(nextFrame()) );
+}
+
+
+SWindsWidget::~SWindsWidget()
+{
+ // Free memory
+ delete[] _winds;
+}
+
+
+void SWindsWidget::paintGL()
+{
+ glLoadIdentity();
+
+ if( ! dBlur )
+ {
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
+ else
+ {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(0.0f, 0.0f, 0.0f, 0.5f - (float(dBlur) * 0.0049f));
+
+ glBegin(GL_QUADS);
+ glVertex3f(-40.0f, -17.0f, 0.0f);
+ glVertex3f(40.0f, -17.0f, 0.0f);
+ glVertex3f(40.0f, 17.0f, 0.0f);
+ glVertex3f(-40.0f, 17.0f, 0.0f);
+ glEnd();
+
+ if(!dGeometry)
+ glBlendFunc(GL_ONE, GL_ONE);
+ else
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE); // Necessary for point and line smoothing (I don't know why)
+ // Maybe it's just my video card...
+ }
+
+ // You should need to draw twice if using blur, once to each buffer.
+ // But wglSwapLayerBuffers appears to copy the back to the
+ // front instead of just switching the pointers to them. It turns
+ // out that both NVidia and 3dfx prefer to use PFD_SWAP_COPY instead
+ // of PFD_SWAP_EXCHANGE in the PIXELFORMATDESCRIPTOR. I don't know why...
+ // So this may not work right on other platforms or all video cards.
+
+ // Update surfaces
+ if( _winds )
+ {
+ _ec = this;
+ int i;
+ for(i=0; i<dWinds; i++)
+ _winds[i].update();
+ }
+
+ glFlush();
+}
+
+
+void SWindsWidget::resizeGL( int w, int h )
+{
+ glViewport(0, 0, w, h );
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90.0, (float) w / (float) h, 1.0, 10000);
+ glTranslatef(0.0, 0.0, -15.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+// Window initialization
+void SWindsWidget::initializeGL()
+{
+ updateParameters();
+ _timer->start( _frameTime, true );
+}
+
+
+#ifdef UNIT_TEST
+void SWindsWidget::keyPressEvent( QKeyEvent* e )
+{
+ if( e->key() == Qt::Key_0 ) { setDefaults( 0 ); updateParameters(); }
+ if( e->key() == Qt::Key_1 ) { setDefaults( 1 ); updateParameters(); }
+ if( e->key() == Qt::Key_2 ) { setDefaults( 2 ); updateParameters(); }
+ if( e->key() == Qt::Key_3 ) { setDefaults( 3 ); updateParameters(); }
+ if( e->key() == Qt::Key_4 ) { setDefaults( 4 ); updateParameters(); }
+ if( e->key() == Qt::Key_5 ) { setDefaults( 5 ); updateParameters(); }
+}
+#endif
+
+
+void SWindsWidget::nextFrame()
+{
+ updateGL();
+ _timer->start( _frameTime, true );
+}
+
+
+void SWindsWidget::updateParameters()
+{
+ int i, j;
+ float x, y, temp;
+
+ srand((unsigned)time(NULL));
+ rand(); rand(); rand(); rand(); rand();
+
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if(!dGeometry)
+ glBlendFunc(GL_ONE, GL_ONE);
+ else
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE); // Necessary for point and line smoothing (I don't know why)
+ glEnable(GL_BLEND);
+
+ if( ! dGeometry )
+ {
+ // Init lights
+ for(i=0; i<LIGHTSIZE; i++)
+ {
+ for(j=0; j<LIGHTSIZE; j++)
+ {
+ x = float(i - LIGHTSIZE / 2) / float(LIGHTSIZE / 2);
+ y = float(j - LIGHTSIZE / 2) / float(LIGHTSIZE / 2);
+ temp = 1.0f - float(sqrt((x * x) + (y * y)));
+ if(temp > 1.0f)
+ temp = 1.0f;
+ if(temp < 0.0f)
+ temp = 0.0f;
+ lightTexture[i][j] = (unsigned char) (255.0f * temp);
+ }
+ }
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, 1);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexImage2D(GL_TEXTURE_2D, 0, 1, LIGHTSIZE, LIGHTSIZE, 0,
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, lightTexture);
+
+ temp = 0.02f * dSize;
+ glNewList(1, GL_COMPILE);
+ glBindTexture(GL_TEXTURE_2D, 1);
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex3f(-temp, -temp, 0.0f);
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex3f(temp, -temp, 0.0f);
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex3f(-temp, temp, 0.0f);
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex3f(temp, temp, 0.0f);
+ glEnd();
+ glEndList();
+ }
+ else if(dGeometry == 1)
+ {
+ // init point smoothing
+ glEnable(GL_POINT_SMOOTH);
+ glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
+
+ glDisable(GL_TEXTURE_2D);
+ }
+ else if(dGeometry == 2)
+ {
+ // init line smoothing
+ glEnable(GL_LINE_SMOOTH);
+ glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+
+ glDisable(GL_TEXTURE_2D);
+ }
+
+
+ // Initialize surfaces
+ _ec = this;
+ delete[] _winds;
+ _winds = new wind[dWinds];
+}
+
+
+/**
+ May be called at any time - makes no OpenGL calls.
+*/
+void SWindsWidget::setDefaults(int which)
+{
+ switch(which)
+ {
+ case CosmicStrings:
+ dWinds = 1;
+ dEmitters = 50;
+ dParticles = 3000;
+ dGeometry = 2;
+ dSize = 20;
+ dWindspeed = 10;
+ dEmitterspeed = 10;
+ dParticlespeed = 10;
+ dBlur = 10;
+ break;
+
+ case ColdPricklies:
+ dWinds = 1;
+ dEmitters = 300;
+ dParticles = 3000;
+ dGeometry = 2;
+ dSize = 5;
+ dWindspeed = 20;
+ dEmitterspeed = 100;
+ dParticlespeed = 15;
+ dBlur = 70;
+ break;
+
+ case SpaceFur:
+ dWinds = 2;
+ dEmitters = 400;
+ dParticles = 1600;
+ dGeometry = 2;
+ dSize = 15;
+ dWindspeed = 20;
+ dEmitterspeed = 15;
+ dParticlespeed = 10;
+ dBlur = 0;
+ break;
+
+ case Jiggly:
+ dWinds = 1;
+ dEmitters = 40;
+ dParticles = 1200;
+ dGeometry = 1;
+ dSize = 20;
+ dWindspeed = 100;
+ dEmitterspeed = 20;
+ dParticlespeed = 4;
+ dBlur = 50;
+ break;
+
+ case Undertow:
+ dWinds = 1;
+ dEmitters = 400;
+ dParticles = 1200;
+ dGeometry = 0;
+ dSize = 40;
+ dWindspeed = 20;
+ dEmitterspeed = 1;
+ dParticlespeed = 100;
+ dBlur = 50;
+ break;
+
+ case Regular:
+ default:
+ dWinds = 1;
+ dEmitters = 30;
+ dParticles = 2000;
+ dGeometry = 0;
+ dSize = 50;
+ dWindspeed = 20;
+ dEmitterspeed = 15;
+ dParticlespeed = 10;
+ dBlur = 40;
+ break;
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+
+#ifndef UNIT_TEST
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char* kss_applicationName = "ksolarwinds.kss";
+ KDE_EXPORT const char* kss_description = I18N_NOOP( "Solar Winds" );
+ KDE_EXPORT const char* kss_version = "1.0";
+
+ KDE_EXPORT KScreenSaver* kss_create( WId id )
+ {
+ return new KSWindsScreenSaver( id );
+ }
+
+ KDE_EXPORT QDialog* kss_setup()
+ {
+ return new KSWindsSetup;
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+
+KSWindsScreenSaver::KSWindsScreenSaver( WId id ) : KScreenSaver( id )
+{
+ _flux = new SWindsWidget;
+
+ readSettings();
+
+ embed( _flux );
+ _flux->show();
+}
+
+
+KSWindsScreenSaver::~KSWindsScreenSaver()
+{
+}
+
+
+static int filterRandom( int n )
+{
+ if( (n < 0) || (n >= SWindsWidget::DefaultModes) )
+ {
+ srand((unsigned)time(NULL));
+ n = rand() % SWindsWidget::DefaultModes;
+ }
+ return n;
+}
+
+
+void KSWindsScreenSaver::readSettings()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ _mode = config->readNumEntry( "Mode", SWindsWidget::Regular );
+ _flux->setDefaults( filterRandom(_mode) );
+}
+
+
+/**
+ Any invalid mode will select one at random.
+*/
+void KSWindsScreenSaver::setMode( int id )
+{
+ _mode = id;
+ _flux->setDefaults( filterRandom(id) );
+ _flux->updateParameters();
+}
+
+
+//----------------------------------------------------------------------------
+
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <kmessagebox.h>
+
+
+static const char* defaultText[] =
+{
+ I18N_NOOP( "Regular" ),
+ I18N_NOOP( "Cosmic Strings" ),
+ I18N_NOOP( "Cold Pricklies" ),
+ I18N_NOOP( "Space Fur" ),
+ I18N_NOOP( "Jiggly" ),
+ I18N_NOOP( "Undertow" ),
+ I18N_NOOP( "(Random)" ),
+ 0
+};
+
+
+KSWindsSetup::KSWindsSetup( QWidget* parent, const char* name )
+ : KDialogBase( parent, name, true, i18n( "Setup Solar Wind" ),
+ Ok|Cancel|Help, Ok, true )
+{
+ setButtonText( Help, i18n( "A&bout" ) );
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout* top = new QHBoxLayout( main, 0, spacingHint() );
+
+ QVBoxLayout* leftCol = new QVBoxLayout;
+ top->addLayout( leftCol );
+
+ QLabel* label = new QLabel( i18n("Mode:"), main );
+ leftCol->addWidget( label );
+
+ modeW = new QComboBox( main );
+ int i = 0;
+ while (defaultText[i])
+ modeW->insertItem( i18n(defaultText[i++]) );
+ leftCol->addWidget( modeW );
+
+ leftCol->addStretch();
+
+ // Preview
+ QWidget* preview;
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 165 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ _saver = new KSWindsScreenSaver( preview->winId() );
+ top->addWidget(preview);
+
+ // Now that we have _saver...
+ modeW->setCurrentItem( _saver->mode() ); // set before we connect
+ connect( modeW, SIGNAL(activated(int)), _saver, SLOT(setMode(int)) );
+}
+
+
+KSWindsSetup::~KSWindsSetup()
+{
+ delete _saver;
+}
+
+
+void KSWindsSetup::slotHelp()
+{
+ KMessageBox::about(this,
+ i18n("<h3>Solar Winds 1.0</h3>\n<p>Copyright (c) 2002 Terence M. Welsh<br>\n<a href=\"http://www.reallyslick.com/\">http://www.reallyslick.com/</a></p>\n\n<p>Ported to KDE by Karl Robillard</p>"),
+ QString::null, KMessageBox::AllowLink);
+}
+
+
+/**
+ Ok pressed - save settings and exit
+*/
+void KSWindsSetup::slotOk()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ QString val;
+ val.setNum( modeW->currentItem() );
+ config->writeEntry("Mode", val );
+
+ config->sync();
+ accept();
+}
+#endif
+
+
+//----------------------------------------------------------------------------
+
+
+#ifdef UNIT_TEST
+// moc SolarWinds.h -o SolarWinds.moc
+// g++ -g -DUNIT_TEST SolarWinds.cpp -I/usr/lib/qt3/include -lqt -L/usr/lib/qt3/lib -lGLU -lGL
+
+#include <qapplication.h>
+
+int main( int argc, char** argv )
+{
+ QApplication app( argc, argv );
+
+ SWindsWidget w;
+ app.setMainWidget( &w );
+ w.show();
+
+ return app.exec();
+}
+#endif
+
+
+//EOF
diff --git a/kscreensaver/kdesavers/SolarWinds.h b/kscreensaver/kdesavers/SolarWinds.h
new file mode 100644
index 00000000..8831c015
--- /dev/null
+++ b/kscreensaver/kdesavers/SolarWinds.h
@@ -0,0 +1,138 @@
+#ifndef __SOLARWINDS_H__
+#define __SOLARWINDS_H__
+//============================================================================
+//
+// Terence Welsh Screensaver - Solar Winds
+// http://www.reallyslick.com/
+//
+// Ported to KDE by Karl Robillard
+//
+//============================================================================
+
+
+#include <qgl.h>
+
+
+#define LIGHTSIZE 64
+
+
+class wind;
+class QTimer;
+
+class SWindsWidget : public QGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ enum eDefault
+ {
+ Regular,
+ CosmicStrings,
+ ColdPricklies,
+ SpaceFur,
+ Jiggly,
+ Undertow,
+
+ DefaultModes
+ };
+
+ SWindsWidget( QWidget* parent=0, const char* name=0 );
+ ~SWindsWidget();
+
+ void updateParameters();
+ void setDefaults( int which );
+
+protected:
+
+ void paintGL();
+ void resizeGL( int w, int h );
+ void initializeGL();
+#ifdef UNIT_TEST
+ void keyPressEvent( QKeyEvent* );
+#endif
+
+private slots:
+
+ void nextFrame();
+
+private:
+
+ wind* _winds;
+ unsigned char lightTexture[LIGHTSIZE][LIGHTSIZE];
+
+ int dWinds;
+ int dEmitters;
+ int dParticles;
+ int dGeometry;
+ float dSize;
+ int dParticlespeed;
+ int dEmitterspeed;
+ int dWindspeed;
+ int dBlur;
+
+
+ // Using QTimer rather than timerEvent() to avoid getting locked out of
+ // the QEvent loop on lower-end systems. Ian Geiser <geiseri@kde.org>
+ // says this is the way to go.
+ QTimer* _timer;
+ int _frameTime;
+
+ friend class wind;
+};
+
+
+#ifndef UNIT_TEST
+#include <kdialogbase.h>
+#include <kscreensaver.h>
+
+
+class KSWindsScreenSaver : public KScreenSaver
+{
+ Q_OBJECT
+
+public:
+
+ KSWindsScreenSaver( WId id );
+ virtual ~KSWindsScreenSaver();
+
+ int mode() const { return _mode; }
+
+public slots:
+
+ void setMode( int );
+
+private:
+
+ void readSettings();
+
+ SWindsWidget* _flux;
+ int _mode;
+};
+
+
+class QComboBox;
+
+class KSWindsSetup : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ KSWindsSetup( QWidget* parent = 0, const char* name = 0 );
+ ~KSWindsSetup();
+
+private slots:
+
+ void slotHelp();
+ void slotOk();
+
+private:
+
+ QComboBox* modeW;
+ KSWindsScreenSaver* _saver;
+};
+#endif
+
+
+#endif //__SOLARWINDS_H__
diff --git a/kscreensaver/kdesavers/banner.cpp b/kscreensaver/kdesavers/banner.cpp
new file mode 100644
index 00000000..5309c05a
--- /dev/null
+++ b/kscreensaver/kdesavers/banner.cpp
@@ -0,0 +1,509 @@
+//-----------------------------------------------------------------------------
+//
+// kbanner - Basic screen saver for KDE
+//
+// Copyright (c) Martin R. Jones 1996
+//
+// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org>
+// clock function and color cycling added 2000/01/09 by Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
+// 2001/03/04 Converted to use libkscreensaver by Martin R. Jones
+// 2002/04/07 Added random vertical position of text,
+// changed horizontal step size to reduce jerkyness,
+// text will return to right margin immediately (and not be drawn half a screen width off-screen)
+// Harald H.-J. Bongartz <harald@bongartz.org>
+// 2003/09/06 Converted to use KDialogBase - Nadeem Hasan <nhasan@kde.org>
+#include <stdlib.h>
+
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <qdatetime.h>
+#include <qfontdatabase.h>
+#include <qpainter.h>
+
+#include <kapplication.h>
+#include <krandomsequence.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <kcolorbutton.h>
+#include <kfontcombo.h>
+
+#include "banner.h"
+#include "banner.moc"
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kbanner.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "KBanner" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KBannerSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KBannerSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+KBannerSetup::KBannerSetup( QWidget *parent, const char *name )
+ : KDialogBase( parent, name, true, i18n( "Setup Banner Screen Saver" ),
+ Ok|Cancel|Help, Ok, true ), saver( 0 ), ed(0), speed( 50 )
+{
+ setButtonText( Help, i18n( "A&bout" ) );
+ readSettings();
+
+ QWidget *main = makeMainWidget();
+
+ QLabel *label;
+
+ QVBoxLayout *tl = new QVBoxLayout(main, 0, spacingHint());
+ QHBoxLayout *tl1 = new QHBoxLayout( 0, 0, spacingHint() );
+ tl->addLayout(tl1);
+ QVBoxLayout *tl11 = new QVBoxLayout( 0, 0, spacingHint() );
+ tl1->addLayout(tl11);
+
+ QGroupBox *group = new QGroupBox( 0, Vertical, i18n("Font"), main );
+ QGridLayout *gl = new QGridLayout(group->layout(), 6, 2, spacingHint() );
+
+ label = new QLabel( i18n("Family:"), group );
+ gl->addWidget(label, 1, 0);
+
+ KFontCombo* comboFonts = new KFontCombo( QFontDatabase().families(), group );
+ comboFonts->setCurrentFont( fontFamily );
+ gl->addWidget(comboFonts, 1, 1);
+ connect( comboFonts, SIGNAL( activated( const QString& ) ),
+ SLOT( slotFamily( const QString& ) ) );
+
+ label = new QLabel( i18n("Size:"), group );
+ gl->addWidget(label, 2, 0);
+
+ comboSizes = new QComboBox( TRUE, group );
+ fillFontSizes();
+ gl->addWidget(comboSizes, 2, 1);
+ connect( comboSizes, SIGNAL( activated( int ) ), SLOT( slotSize( int ) ) );
+ connect( comboSizes, SIGNAL( textChanged( const QString & ) ),
+ SLOT( slotSizeEdit( const QString & ) ) );
+
+ QCheckBox *cb = new QCheckBox( i18n("Bold"),
+ group );
+ cb->setChecked( bold );
+ connect( cb, SIGNAL( toggled( bool ) ), SLOT( slotBold( bool ) ) );
+ gl->addWidget(cb, 3, 0);
+
+ cb = new QCheckBox( i18n("Italic"), group );
+ cb->setChecked( italic );
+ gl->addWidget(cb, 3, 1);
+ connect( cb, SIGNAL( toggled( bool ) ), SLOT( slotItalic( bool ) ) );
+
+ label = new QLabel( i18n("Color:"), group );
+ gl->addWidget(label, 4, 0);
+
+ colorPush = new KColorButton( fontColor, group );
+ gl->addWidget(colorPush, 4, 1);
+ connect( colorPush, SIGNAL( changed(const QColor &) ),
+ SLOT( slotColor(const QColor &) ) );
+
+ QCheckBox *cyclingColorCb=new QCheckBox(i18n("Cycling color"),group);
+ cyclingColorCb->setMinimumSize(cyclingColorCb->sizeHint());
+ gl->addMultiCellWidget(cyclingColorCb,5,5,0,1);
+ connect(cyclingColorCb,SIGNAL(toggled(bool)),this,SLOT(slotCyclingColor(bool)));
+ cyclingColorCb->setChecked(cyclingColor);
+
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new KBannerSaver( preview->winId() );
+ tl1->addWidget(preview);
+
+ tl11->addWidget(group);
+
+ label = new QLabel( i18n("Speed:"), main );
+ tl11->addStretch(1);
+ tl11->addWidget(label);
+
+ QSlider *sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, main );
+ sb->setMinimumWidth( 180);
+ sb->setFixedHeight(20);
+ sb->setTickmarks(QSlider::Below);
+ sb->setTickInterval(10);
+ tl11->addWidget(sb);
+ connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) );
+
+ QHBoxLayout *tl2 = new QHBoxLayout;
+ tl->addLayout(tl2);
+
+ label = new QLabel( i18n("Message:"), main );
+ tl2->addWidget(label);
+
+ ed = new QLineEdit( main );
+ tl2->addWidget(ed);
+ ed->setText( message );
+ connect( ed, SIGNAL( textChanged( const QString & ) ),
+ SLOT( slotMessage( const QString & ) ) );
+
+ QCheckBox *timeCb=new QCheckBox( i18n("Show current time"), main);
+ timeCb->setFixedSize(timeCb->sizeHint());
+ tl->addWidget(timeCb,0,Qt::AlignLeft);
+ connect(timeCb,SIGNAL(toggled(bool)),this,SLOT(slotTimeToggled(bool)));
+ timeCb->setChecked(showTime);
+
+ tl->addStretch();
+}
+
+// read settings from config file
+void KBannerSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ speed=config->readNumEntry("Speed",50);
+/* if ( speed > 100 )
+ speed = 100;
+ else if ( speed < 50 )
+ speed = 50;*/
+
+ message=config->readEntry("Message","KDE");
+ showTime=config->readBoolEntry("ShowTime",FALSE);
+ fontFamily=config->readEntry("FontFamily",(QApplication::font()).family());
+ fontSize=config->readNumEntry("FontSize",48);
+ fontColor.setNamedColor(config->readEntry("FontColor","red"));
+ cyclingColor=config->readBoolEntry("CyclingColor",FALSE);
+ bold=config->readBoolEntry("FontBold",FALSE);
+ italic=config->readBoolEntry("FontItalic",FALSE);
+}
+
+void KBannerSetup::fillFontSizes()
+{
+ bool block = comboSizes->signalsBlocked();
+ comboSizes->blockSignals( true );
+ comboSizes->clear();
+ int i = 0;
+ sizes = QFontDatabase().pointSizes( fontFamily );
+ sizes << 96 << 128 << 156 << 0;
+ int current = 0;
+ while ( sizes[i] )
+ {
+ QString num;
+ num.setNum( sizes[i] );
+ comboSizes->insertItem( num, i );
+ if ( fontSize == sizes[i] ) // fontsize equals one of the defined ones
+ {
+ current = i;
+ comboSizes->setCurrentItem( current );
+ slotSize( current );
+ }
+ i++;
+ }
+ if ( current == 0 ) // fontsize seems to be entered by hand
+ {
+ QString fsize;
+ fsize.setNum( fontSize );
+ comboSizes->setEditText(fsize);
+ slotSizeEdit( fsize );
+ }
+ comboSizes->blockSignals( block );
+}
+
+void KBannerSetup::slotFamily( const QString& fam )
+{
+ fontFamily = fam;
+ fillFontSizes(); // different font, different sizes
+ if ( saver )
+ saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
+}
+
+void KBannerSetup::slotSize( int indx )
+{
+ fontSize = sizes[indx];
+ if ( saver )
+ saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
+}
+
+void KBannerSetup::slotSizeEdit( const QString& fs )
+{
+ bool ok;
+ fontSize = fs.toInt( &ok, 10 );
+ if ( ok )
+ if ( saver )
+ saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
+}
+
+void KBannerSetup::slotColor( const QColor &col )
+{
+ fontColor = col;
+ if ( saver )
+ saver->setColor(fontColor);
+}
+
+void KBannerSetup::slotCyclingColor(bool on)
+{
+ colorPush->setEnabled(!on);
+ cyclingColor=on;
+
+ if ( saver )
+ {
+ saver->setCyclingColor( on );
+ if ( !on )
+ saver->setColor( fontColor );
+ }
+}
+
+void KBannerSetup::slotBold( bool state )
+{
+ bold = state;
+ if ( saver )
+ saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
+}
+
+void KBannerSetup::slotItalic( bool state )
+{
+ italic = state;
+ if ( saver )
+ saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
+}
+
+void KBannerSetup::slotSpeed( int num )
+{
+ speed = num;
+ if ( saver )
+ saver->setSpeed( speed );
+}
+
+void KBannerSetup::slotMessage( const QString &msg )
+{
+ message = msg;
+ if ( saver )
+ saver->setMessage( message );
+}
+
+void KBannerSetup::slotTimeToggled( bool on )
+{
+ ed->setEnabled(!on);
+ showTime=on;
+ if (saver)
+ {
+ if (showTime)
+ saver->setTimeDisplay();
+ else
+ {
+ message=ed->text();
+ saver->setMessage(message);
+ };
+ };
+}
+
+// Ok pressed - save settings and exit
+void KBannerSetup::slotOk()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ config->writeEntry( "Speed", speed );
+ config->writeEntry( "Message", message );
+ config->writeEntry( "ShowTime", showTime );
+ config->writeEntry( "FontFamily", fontFamily );
+
+ QString fsize;
+ if (fontSize == 0) // an non-number was entered in the font size combo
+ {
+ fontSize = 48;
+ }
+ fsize.setNum( fontSize );
+ config->writeEntry( "FontSize", fsize );
+
+ QString colName;
+ colName.sprintf( "#%02x%02x%02x", fontColor.red(), fontColor.green(),
+ fontColor.blue() );
+ config->writeEntry( "FontColor", colName );
+ config->writeEntry( "CyclingColor", cyclingColor );
+ config->writeEntry( "FontBold", bold );
+ config->writeEntry( "FontItalic", italic );
+
+ config->sync();
+
+ accept();
+}
+
+void KBannerSetup::slotHelp()
+{
+ KMessageBox::about(this,
+ i18n("Banner Version 2.2.1\n\nWritten by Martin R. Jones 1996\nmjones@kde.org\nExtended by Alexander Neundorf 2000\nalexander.neundorf@rz.tu-ilmenau.de\n"));
+}
+
+//-----------------------------------------------------------------------------
+
+KBannerSaver::KBannerSaver( WId id ) : KScreenSaver( id )
+{
+ krnd = new KRandomSequence();
+ readSettings();
+ initialize();
+ colorContext = QColor::enterAllocContext();
+ needBlank = TRUE;
+ timer.start( speed );
+ connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) );
+}
+
+KBannerSaver::~KBannerSaver()
+{
+ timer.stop();
+ QColor::leaveAllocContext();
+ QColor::destroyAllocContext( colorContext );
+ delete krnd;
+}
+
+void KBannerSaver::setSpeed( int spd )
+{
+ timer.stop();
+ int inv = 100 - spd;
+ speed = 1 + ((inv * inv) / 100);
+ timer.start( speed );
+}
+
+void KBannerSaver::setFont( const QString& family, int size, const QColor &color,
+ bool b, bool i )
+{
+ fontFamily = family;
+ fontSize = size;
+ fontColor = color;
+ bold = b;
+ italic = i;
+
+ initialize();
+}
+
+void KBannerSaver::setColor(QColor &color)
+{
+ fontColor = color;
+ cyclingColor = FALSE;
+ needUpdate = TRUE;
+}
+
+void KBannerSaver::setCyclingColor( bool on )
+{
+ cyclingColor = on;
+ needUpdate = TRUE;
+}
+
+void KBannerSaver::setMessage( const QString &msg )
+{
+ showTime = FALSE;
+ message = msg;
+ pixmapSize = QSize();
+ needBlank = TRUE;
+}
+
+void KBannerSaver::setTimeDisplay()
+{
+ showTime = TRUE;
+ pixmapSize = QSize();
+ needBlank = TRUE;
+}
+
+// read settings from config file
+void KBannerSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ setSpeed( config->readNumEntry("Speed",50) );
+
+ message=config->readEntry("Message","KDE");
+
+ showTime=config->readBoolEntry("ShowTime",FALSE);
+
+ fontFamily=config->readEntry("FontFamily",(QApplication::font()).family());
+
+ fontSize=config->readNumEntry("FontSize",48);
+
+ fontColor.setNamedColor(config->readEntry("FontColor","red"));
+
+ cyclingColor=config->readBoolEntry("CyclingColor",FALSE);
+
+ bold=config->readBoolEntry("FontBold",FALSE);
+ italic=config->readBoolEntry("FontItalic",FALSE);
+
+ if ( cyclingColor )
+ {
+ currentHue=0;
+ fontColor.setHsv(0,SATURATION,VALUE);
+ }
+}
+
+// initialize font
+void KBannerSaver::initialize()
+{
+ fsize = fontSize * height() / QApplication::desktop()->height();
+
+ font = QFont( fontFamily, fsize, bold ? QFont::Bold : QFont::Normal, italic );
+
+ pixmapSize = QSize();
+ needBlank = TRUE;
+
+ xpos = width();
+ ypos = fsize + (int) ((double)(height()-fsize)*krnd->getDouble());
+ step = 2 * width() / QApplication::desktop()->width(); // 6 -> 2 -hhjb-
+ if ( step == 0 )
+ step = 1;
+}
+
+// erase old text and draw in new position
+void KBannerSaver::slotTimeout()
+{
+ if (cyclingColor)
+ {
+ int hueStep = speed/10;
+ currentHue=(currentHue+hueStep)%360;
+ fontColor.setHsv(currentHue,SATURATION,VALUE);
+ }
+ if (showTime)
+ {
+ QString new_message = KGlobal::locale()->formatTime(QTime::currentTime(), true);
+ if( new_message != message )
+ needUpdate = TRUE;
+ message = new_message;
+ }
+ if ( !pixmapSize.isValid() || cyclingColor || needUpdate || needBlank )
+ {
+ QRect rect = QFontMetrics( font ).boundingRect( message );
+ rect.setWidth( rect.width() + step );
+ if ( rect.width() > pixmapSize.width() )
+ pixmapSize.setWidth( rect.width() );
+ if ( rect.height() > pixmapSize.height() )
+ pixmapSize.setHeight( rect.height() );
+ pixmap = QPixmap( pixmapSize );
+ pixmap.fill( black );
+ QPainter p( &pixmap );
+ p.setFont( font );
+ p.setPen( fontColor );
+ p.drawText( -rect.x(), -rect.y(), message );
+ needUpdate = FALSE;
+ }
+ xpos -= step;
+ if ( xpos < -pixmapSize.width() ) {
+ QPainter p( this );
+ p.fillRect( xpos + step, ypos, pixmapSize.width(), pixmapSize.height(), black );
+ xpos = width();
+ ypos = fsize + (int) ((double)(height()-2.0*fsize)*krnd->getDouble());
+ }
+
+ if ( needBlank )
+ {
+ setBackgroundColor( black );
+ erase();
+ needBlank = FALSE;
+ }
+ bitBlt( this, xpos, ypos, &pixmap, 0, 0, pixmapSize.width(), pixmapSize.height());
+}
diff --git a/kscreensaver/kdesavers/banner.h b/kscreensaver/kdesavers/banner.h
new file mode 100644
index 00000000..026b817d
--- /dev/null
+++ b/kscreensaver/kdesavers/banner.h
@@ -0,0 +1,112 @@
+//-----------------------------------------------------------------------------
+//
+// kbanner - Basic screen saver for KDE
+//
+// Copyright (c) Martin R. Jones 1996
+//
+
+#ifndef __BANNER_H__
+#define __BANNER_H__
+
+#include <qtimer.h>
+
+#include <kscreensaver.h>
+#include <kdialogbase.h>
+
+#define SATURATION 150
+#define VALUE 255
+
+class QLineEdit;
+class KColorButton;
+class KRandomSequence;
+
+class KBannerSaver : public KScreenSaver
+{
+ Q_OBJECT
+public:
+ KBannerSaver( WId id );
+ virtual ~KBannerSaver();
+
+ void setSpeed( int spd );
+ void setFont( const QString &family, int size, const QColor &color,
+ bool b, bool i );
+ void setMessage( const QString &msg );
+ void setTimeDisplay();
+ void setCyclingColor(bool on);
+ void setColor( QColor &color);
+
+private:
+ void readSettings();
+ void initialize();
+
+protected slots:
+ void slotTimeout();
+
+protected:
+ QFont font;
+ QTimer timer;
+ QString fontFamily;
+ int fontSize;
+ bool bold;
+ bool italic;
+ QColor fontColor;
+ bool cyclingColor;
+ int currentHue;
+ bool needUpdate;
+ bool needBlank;
+ QString message;
+ bool showTime;
+ int xpos, ypos, step, fsize;
+ KRandomSequence *krnd;
+ int speed;
+ int colorContext;
+ QPixmap pixmap;
+ QSize pixmapSize;
+};
+
+
+class KBannerSetup : public KDialogBase
+{
+ Q_OBJECT
+public:
+ KBannerSetup( QWidget *parent = NULL, const char *name = NULL );
+
+protected:
+ void readSettings();
+ void fillFontSizes();
+
+private slots:
+ void slotFamily( const QString & );
+ void slotSize( int );
+ void slotSizeEdit(const QString &);
+ void slotColor(const QColor &);
+ void slotCyclingColor(bool on);
+ void slotBold( bool );
+ void slotItalic( bool );
+ void slotSpeed( int );
+ void slotMessage( const QString & );
+ void slotOk();
+ void slotHelp();
+ void slotTimeToggled(bool on);
+
+private:
+ QWidget *preview;
+ KColorButton *colorPush;
+ KBannerSaver *saver;
+ QLineEdit *ed;
+ QComboBox* comboSizes;
+
+ QString message;
+ bool showTime;
+ QString fontFamily;
+ int fontSize;
+ QColor fontColor;
+ bool cyclingColor;
+ bool bold;
+ bool italic;
+ int speed;
+ QValueList<int> sizes;
+};
+
+#endif
+
diff --git a/kscreensaver/kdesavers/blob.cpp b/kscreensaver/kdesavers/blob.cpp
new file mode 100644
index 00000000..e717c7ee
--- /dev/null
+++ b/kscreensaver/kdesavers/blob.cpp
@@ -0,0 +1,527 @@
+//-----------------------------------------------------------------------------
+//
+// kblob - Basic screen saver for KDE
+//
+// Copyright (c) Tiaan Wessels, 1997
+//
+// To add new alg :
+// - add blob_alg enum in blob.h before ALG_LAST
+// - choose 2 letter prefix for alg and add vars needed to private vars
+// in KBlobSaver in blob.h
+// - add xxSetup and xxNextFrame method definitions in blob.h
+// - implement methods in this file. xxSetup to init vars mentioned
+// in step 2. xxNextFrame to advance blob painter ( calc tx,ty and
+// use box() method to position painter
+// - add descriptive string in alg_str array in this file before "Random"
+// - add to Algs array in KBlobSaver constructor in this file
+// - test by setup saver and choosing alg from list
+
+#include <config.h>
+#include <stdlib.h>
+#include <time.h>
+#include <limits.h>
+#include <math.h>
+
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qlistbox.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qimage.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <knuminput.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <krandomsequence.h>
+
+#include "blob.moc"
+#include "blob.h"
+
+#define SMALLRAND(a) (int)(rnd->getLong(a)+1)
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kblob.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "KBlob" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KBlobSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KBlobSetup();
+ }
+}
+
+static KRandomSequence *rnd = 0;
+
+QString alg_str[5];
+void initAlg()
+{
+ alg_str[0] = i18n("Random Linear");
+ alg_str[1] = i18n("Horizontal Sine");
+ alg_str[2] = i18n("Circular Bounce");
+ alg_str[3] = i18n("Polar Coordinates");
+ alg_str[4] = i18n("Random");
+}
+
+//-----------------------------------------------------------------------------
+// the blob screensaver's code
+
+KBlobSaver::KBlobSaver ( WId id)
+ : KScreenSaver( id )
+{
+ rnd = new KRandomSequence();
+ initAlg();
+ QColor color;
+ float ramp = (256.0-64.0)/(float)RAMP;
+ QString msg =
+ i18n("This screen saver requires a color display.");
+
+ blank();
+
+ // needs colors to work this one
+ if (QPixmap::defaultDepth() < 8)
+ {
+ QPainter p(this);
+ p.setPen( white );
+ p.drawText( width()/2, height()/2, msg );
+ return;
+ }
+
+ colorContext = QColor::enterAllocContext();
+
+ // if 8-bit, create lookup table for color ramping further down
+ if (QPixmap::defaultDepth() == 8)
+ {
+ memset(lookup, 0, 256*sizeof(uint));
+ int i;
+ for (i = 0; i < RAMP; i++)
+ {
+ color.setRgb(64+(int)(ramp*(float)i), 0, 0);
+ colors[i] = color.alloc();
+ }
+ memset(lookup, black.pixel(), sizeof(uint)*256);
+ for (i = 0; i < RAMP-1; i++)
+ lookup[colors[i]] = colors[i+1];
+ lookup[black.pixel()] = lookup[colors[RAMP-1]] = colors[0];
+ }
+ else
+ {
+ // make special provision for preview mode
+ if (height() < 400)
+ {
+ if (QPixmap::defaultDepth() > 8 )
+ setColorInc(7);
+ else
+ setColorInc(4);
+ }
+ else
+ {
+ if (QPixmap::defaultDepth() > 8 )
+ setColorInc(3);
+ else
+ setColorInc(2);
+ }
+ }
+
+ // the dimensions of the blob painter
+ dim = height()/70+1;
+
+ // record starting time to know when to change frames
+ start = time(NULL);
+
+ // init some parameters used by all algorithms
+ xhalf = width()/2;
+ yhalf = height()/2;
+
+ // means a new algorithm should be set at entrance of timer
+ newalg = newalgp = 1;
+
+ // init algorithm space
+ Algs[0].Name = alg_str[0];
+ Algs[0].Init = &KBlobSaver::lnSetup;
+ Algs[0].NextFrame = &KBlobSaver::lnNextFrame;
+
+ Algs[1].Name = alg_str[1];
+ Algs[1].Init = &KBlobSaver::hsSetup;
+ Algs[1].NextFrame = &KBlobSaver::hsNextFrame;
+
+ Algs[2].Name = alg_str[2];
+ Algs[2].Init = &KBlobSaver::cbSetup;
+ Algs[2].NextFrame = &KBlobSaver::cbNextFrame;
+
+ Algs[3].Name = alg_str[3];
+ Algs[3].Init = &KBlobSaver::pcSetup;
+ Algs[3].NextFrame = &KBlobSaver::pcNextFrame;
+
+ // get setup from kde registry
+ readSettings();
+
+ // start timer which will update blob painter
+ timer.start(SPEED);
+ connect(&timer, SIGNAL(timeout()), SLOT(slotTimeout()));
+}
+
+KBlobSaver::~KBlobSaver()
+{
+ timer.stop();
+
+ QColor::leaveAllocContext();
+ QColor::destroyAllocContext(colorContext);
+ delete rnd; rnd = 0;
+}
+
+void KBlobSaver::setAlgorithm(int a)
+{
+ newalg = newalgp = ((a == ALG_RANDOM) ? 1 : 2);
+ alg = a;
+}
+
+void KBlobSaver::lnSetup()
+{
+ // initialize the blob movement dictators with random vals
+ // incrementals on axis
+ ln_xinc = SMALLRAND(3);
+ ln_yinc = SMALLRAND(2);
+
+ // start position
+ tx = SMALLRAND(width()-dim-ln_xinc*2);
+ ty = SMALLRAND(height()-dim-ln_yinc*2);
+}
+
+void KBlobSaver::hsSetup()
+{
+ hs_per = SMALLRAND(7);
+ hs_radians = 0.0;
+ hs_rinc = (hs_per*M_PI)/(hs_per*90*4);
+ hs_flip = 1.0;
+}
+
+void KBlobSaver::cbSetup()
+{
+ cb_radians = 0.0;
+ cb_rinc = (2.0*M_PI)/360.0;
+ cb_sradians = 0.0;
+ cb_deviate = SMALLRAND(height()/20)+(height()/15);
+ cb_radius = height()/2-cb_deviate*2-2*dim;
+ cb_devradinc = (rnd->getDouble()*10.0*2.0*M_PI)/360.0;
+}
+
+void KBlobSaver::pcSetup()
+{
+ pc_angle = 0.0;
+ pc_radius = 0.0;
+ pc_inc = (2.0*M_PI)/720.0;
+ pc_crot = 0.0;
+ pc_div = SMALLRAND(4)-1;
+}
+
+// render next frame ( or change algorithms )
+void KBlobSaver::slotTimeout()
+{
+ time_t now = time(NULL);
+
+ // should algorithm be changed
+ if (now-start > showlen)
+ newalg = newalgp;
+
+ // set new algorithm
+ if (newalg)
+ {
+ blank();
+ if (newalg == 1)
+ alg = SMALLRAND(ALG_LAST)-1;
+ (this->*Algs[alg].Init)();
+ newalg = 0;
+ start = time(NULL);
+ }
+
+ // gen next fram for current algorithm
+ (this->*Algs[alg].NextFrame)();
+}
+
+void KBlobSaver::lnNextFrame()
+{
+ int dir;
+
+ // depending on the algorithm to use, move the blob painter to
+ // a new location
+ // check for wall hit to change direction
+ if (tx+dim+ln_xinc > (int)width()-1 || tx+ln_xinc < 0)
+ {
+ if (ln_xinc > 0)
+ dir = -1;
+ else
+ dir = 1;
+ ln_xinc = SMALLRAND(3)*dir;
+ }
+ if (ty+dim+ln_yinc > (int)height()-1 || ty+ln_yinc < 0)
+ {
+ if (ln_yinc > 0)
+ dir = -1;
+ else
+ dir = 1;
+ ln_yinc = SMALLRAND(2)*dir;
+ }
+
+ // move box to new position
+ tx += ln_xinc;
+ ty += ln_yinc;
+
+ // draw new box
+ box(tx, ty);
+}
+
+void KBlobSaver::hsNextFrame()
+{
+ static int xlen = width()-(4*dim);
+ static int ylen = height()-(4*dim);
+
+ // calc x as offset on angle line and y as vertical offset
+ // on interval -1..1 sine of angle
+ tx = (int)((hs_radians/(hs_per*M_PI))*(float)xlen);
+ ty = (int)((float)(ylen/4)*(hs_flip*sin(hs_radians)))+yhalf;
+
+ // draw new box
+ box(tx, ty);
+
+ // set new radians
+ hs_radians += hs_rinc;
+ if (hs_radians > hs_per*M_PI)
+ {
+ hs_rinc *= -1.0;
+ hs_radians += hs_rinc;
+ hs_flip *= -1.0;
+ }
+ else if (hs_radians < 0.0)
+ hsSetup();
+}
+
+void KBlobSaver::cbNextFrame()
+{
+ int deviate;
+
+ // calculate deviation of circle main radius
+ deviate = (int)(sin(cb_sradians)*cb_deviate);
+
+ // calculate topleft of box as a circle with a sine perturbed radius
+ tx = (int)(cos(cb_radians)*(cb_radius+deviate))+xhalf;
+ ty = (int)(sin(cb_radians)*(cb_radius+deviate))+yhalf;
+
+ // draw the box
+ box(tx, ty);
+
+ // increase greater circle render angle
+ cb_radians += cb_rinc;
+ if (cb_radians > 2.0*M_PI)
+ cb_radians -= 2.0*M_PI;
+
+ // increase radius deviation offset on sine wave
+ cb_sradians += cb_devradinc;
+}
+
+void KBlobSaver::pcNextFrame()
+{
+ static float scale = (float)height()/3.0 - 4.0*dim;
+
+ // simple polar coordinate equation
+ if (pc_div < 1.0)
+ pc_radius = cos(2.0*pc_angle);
+ else
+ pc_radius = 1.0/pc_div + cos(2.0*pc_angle);
+
+ tx = (int)(scale*pc_radius*cos(pc_angle+pc_crot))+xhalf;
+ ty = (int)(scale*pc_radius*sin(pc_angle+pc_crot))+yhalf;
+
+ // advance blob painter
+ box(tx, ty);
+
+ // new movement parameters
+ pc_angle += pc_inc;
+ if (pc_angle > 2.0*M_PI)
+ {
+ pc_angle -= 2.0*M_PI;
+ pc_crot += M_PI/45.0;
+ }
+}
+
+void KBlobSaver::box ( int x, int y )
+{
+ // for bad behaving algorithms that wants to cause an X trap
+ // confine to the valid region before using potentially fatal XGetImage
+ if ((x+dim) >= width())
+ x = width()-dim-1;
+ else if (x < 0)
+ x = 0;
+ if ((y+dim) > height())
+ y = height()-dim-1;
+ else if (y < 0)
+ y = 0;
+
+ // get the box region from the display to upgrade
+ QImage img = QPixmap::grabWindow(winId(), x, y, dim, dim).convertToImage();
+
+ // depending on the depth of the display, use either lookup table for
+ // next rgb val ( 8-bit ) or ramp the color directly for other displays
+ if ( img.depth() == 8)
+ {
+ // manipulate image by upgrading each pixel with 1 using a lookup
+ // table as the color allocation could have resulted in a spread out
+ // configuration of the color ramp
+ for (int j = 0; j < img.height(); j++)
+ {
+ for (int i = 0; i < img.width(); i++)
+ {
+ img.scanLine(j)[i] = lookup[img.scanLine(j)[i]];
+ }
+ }
+ }
+ else
+ {
+ for (int j = 0; j < img.height(); j++)
+ {
+ for (int i = 0; i < img.width(); i++)
+ {
+ QRgb p = img.pixel( i, j );
+ p += (colorInc<<18);
+ img.setPixel( i, j, p );
+ }
+ }
+ }
+
+ // put the image back onto the screen
+ QPainter p(this);
+ p.drawImage( x, y, img );
+}
+
+void KBlobSaver::blank()
+{
+ setBackgroundColor( black );
+ erase();
+}
+
+void KBlobSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+
+ // number of seconds to spend on a frame
+ showlen = config->readNumEntry("Showtime", 3*60);
+
+ // algorithm to use. if not set then use random
+ alg = config->readNumEntry("Algorithm", ALG_RANDOM);
+ if (alg == ALG_RANDOM)
+ newalg = 1;
+ else
+ newalg = 2;
+ newalgp = newalg;
+}
+
+//-----------------------------------------------------------------------------
+// dialog to setup screen saver parameters
+//
+KBlobSetup::KBlobSetup
+(
+ QWidget *parent,
+ const char *name
+)
+: KDialogBase( parent, name, true, i18n( "Setup Blob Screen Saver" ),
+ Ok|Cancel|Help, Ok, true )
+{
+
+ initAlg();
+
+ // get saver configuration from kde registry
+ readSettings();
+
+ setButtonText( Help, i18n( "A&bout" ) );
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout *tl = new QHBoxLayout( main, 0, spacingHint() );
+
+ QVBoxLayout *vbox = new QVBoxLayout;
+ tl->addLayout(vbox);
+
+ // seconds to generate on a frame
+ QLabel *label = new QLabel(i18n("Frame duration:"), main);
+ stime = new KIntNumInput( showtime, main );
+ stime->setSuffix( i18n( " sec" ) );
+ vbox->addWidget(label);
+ vbox->addWidget(stime);
+
+ // available algorithms
+ label = new QLabel(i18n("Algorithm:"), main);
+ algs = new QListBox(main);
+ algs->setMinimumSize(150, 105);
+ for (int i = 0; i <= ALG_RANDOM; i++)
+ algs->insertItem(alg_str[i]);
+ algs->setCurrentItem(alg);
+ vbox->addWidget(label);
+ vbox->addWidget(algs);
+
+ // preview window
+ QWidget *preview = new QWidget( main );
+ preview->setFixedSize(220, 170);
+ preview->setBackgroundColor(black);
+ preview->show();
+ tl->addWidget(preview);
+ saver = new KBlobSaver(preview->winId());
+ saver->setDimension(3);
+ if (QPixmap::defaultDepth() > 8)
+ saver->setColorInc(7);
+ else
+ saver->setColorInc(4);
+
+ tl->addStretch();
+
+ // so selecting an algorithm will start previewing that alg
+ connect(algs, SIGNAL(highlighted(int)), saver,
+ SLOT(setAlgorithm(int)));
+}
+
+void KBlobSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+
+ // number of seconds to spend on a frame
+ showtime = config->readNumEntry("Showtime", 3*60);
+
+ // algorithm to use. if not set then use random
+ alg = config->readNumEntry("Algorithm", ALG_LAST);
+}
+
+// Ok pressed - save settings and exit
+void KBlobSetup::slotOk()
+{
+ KConfig *config = KGlobal::config();
+
+ config->setGroup("Settings");
+
+ config->writeEntry("Showtime", stime->value());
+ config->writeEntry("Algorithm", algs->currentItem());
+
+ config->sync();
+
+ accept();
+}
+
+void KBlobSetup::slotHelp()
+{
+ KMessageBox::about(this,
+ i18n("Blobsaver Version 0.1\n\nWritten by Tiaan Wessels 1997\ntiaan@netsys.co.za"));
+ if (saver)
+ saver->setAlgorithm(algs->currentItem());
+}
+
+
diff --git a/kscreensaver/kdesavers/blob.h b/kscreensaver/kdesavers/blob.h
new file mode 100644
index 00000000..93a02998
--- /dev/null
+++ b/kscreensaver/kdesavers/blob.h
@@ -0,0 +1,117 @@
+//-----------------------------------------------------------------------------
+//
+// kblob - Basic screen saver for KDE
+//
+// Copyright (c) Tiaan Wessels, 1997
+//
+
+#ifndef __BLOB_H__
+#define __BLOB_H__
+
+#include <qtimer.h>
+#include <qptrlist.h>
+
+#include <kdialogbase.h>
+#include <kscreensaver.h>
+
+#define RAMP 64
+#define SPEED 10
+
+enum blob_alg {
+ ALG_LINEAR,
+ ALG_HSINE,
+ ALG_CIRB,
+ ALG_POLARC,
+ ALG_LAST,
+ ALG_RANDOM = ALG_LAST };
+
+class KBlobSaver : public KScreenSaver
+{
+ Q_OBJECT
+
+public:
+ KBlobSaver( WId id );
+ virtual ~KBlobSaver();
+
+ void setDimension(int d)
+ { dim = d; }
+ void setShowlen(time_t s)
+ { showlen = s; }
+ void setColorInc(int c)
+ { colorInc = c; }
+
+public slots:
+ void setAlgorithm(int);
+
+public:
+ typedef void (KBlobSaver::*AlgFunc)();
+ struct KBSAlg
+ {
+ QString Name;
+ AlgFunc Init;
+ AlgFunc NextFrame;
+ };
+private:
+
+ QTimer timer;
+ uint colors[RAMP];
+ uint lookup[256];
+ int colorContext, colorInc;
+ int tx, ty;
+ int dim;
+ int xhalf, yhalf;
+ int alg, newalg, newalgp;
+ time_t showlen, start;
+ KBSAlg Algs[ALG_LAST];
+ int ln_xinc, ln_yinc;
+ float hs_radians, hs_rinc, hs_flip, hs_per;
+ float cb_radians, cb_rinc, cb_sradians, cb_radius, cb_devradinc;
+ float cb_deviate;
+ float pc_angle, pc_radius, pc_inc, pc_crot, pc_div;
+
+ void lnSetup();
+ void hsSetup();
+ void cbSetup();
+ void pcSetup();
+
+ void lnNextFrame();
+ void hsNextFrame();
+ void cbNextFrame();
+ void pcNextFrame();
+
+ void blank();
+ void box(int, int);
+ void readSettings();
+
+protected slots:
+ void slotTimeout();
+};
+
+class QListBox;
+class KIntNumInput;
+
+class KBlobSetup : public KDialogBase
+{
+ Q_OBJECT
+
+ int showtime;
+ int alg;
+ QListBox *algs;
+ KIntNumInput *stime;
+
+public:
+ KBlobSetup( QWidget *parent = NULL, const char *name = NULL );
+
+protected:
+ void readSettings();
+
+private slots:
+ void slotOk();
+ void slotHelp();
+
+private:
+ KBlobSaver *saver;
+};
+
+#endif
+
diff --git a/kscreensaver/kdesavers/data/Makefile.am b/kscreensaver/kdesavers/data/Makefile.am
new file mode 100644
index 00000000..2882f34c
--- /dev/null
+++ b/kscreensaver/kdesavers/data/Makefile.am
@@ -0,0 +1,11 @@
+# Makefile.am for screensavers data
+
+METASOURCES = AUTO
+
+if COMPILE_GL_KSAVERS
+kfiresaver_DATA = kfs_particle.png kfs_particle_flare.png kfs_particle_diastar.png\
+ kfs_kde.png kfs_tux.png\
+ kfs_letters1.png kfs_letters2.png kfs_letters.desc\
+ kfs_explode.ogg kfs_debris.ogg
+kfiresaverdir = $(kde_datadir)/kfiresaver
+endif
diff --git a/kscreensaver/kdesavers/data/kfs_debris.ogg b/kscreensaver/kdesavers/data/kfs_debris.ogg
new file mode 100644
index 00000000..f1265ec2
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_debris.ogg
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_explode.ogg b/kscreensaver/kdesavers/data/kfs_explode.ogg
new file mode 100644
index 00000000..3eda0ef0
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_explode.ogg
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_kde.png b/kscreensaver/kdesavers/data/kfs_kde.png
new file mode 100644
index 00000000..33f53b33
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_kde.png
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_letters.desc b/kscreensaver/kdesavers/data/kfs_letters.desc
new file mode 100644
index 00000000..186a1b8d
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_letters.desc
@@ -0,0 +1,84 @@
+#first map and its coordinates
+#note that capitals are used for lowercase also
+
+"kfs_letters1.png"
+
+A 0 0 48 63
+a 0 0 48 63
+B 48 0 87 63
+b 48 0 87 63
+C 87 0 132 63
+c 87 0 132 63
+D 132 0 178 63
+d 132 0 178 63
+E 179 0 222 63
+e 179 0 222 63
+
+F 0 64 40 127
+f 0 64 40 127
+G 41 64 89 127
+g 41 64 89 127
+H 89 64 142 127
+h 89 64 142 127
+I 142 64 180 127
+i 142 64 180 127
+J 180 64 227 127
+j 180 64 227 127
+
+K 0 128 40 191
+k 0 128 40 191
+L 41 128 80 191
+l 41 128 80 191
+M 80 128 142 191
+m 80 128 142 191
+N 142 128 196 191
+n 142 128 196 191
+O 196 128 252 191
+o 196 128 252 191
+
+P 0 192 36 255
+p 0 192 36 255
+Q 36 192 97 255
+q 36 192 97 255
+R 97 192 142 255
+r 97 192 142 255
+S 142 192 189 255
+s 142 192 189 255
+T 189 192 244 255
+t 189 192 244 255
+
+
+"kfs_letters2.png"
+
+U 0 0 50 63
+u 0 0 50 63
+V 50 0 97 63
+v 50 0 97 63
+W 97 0 169 63
+w 97 0 169 63
+X 169 0 220 63
+x 169 0 220 63
+, 220 0 239 63
+. 239 0 254 63
+
+Y 0 64 48 127
+y 0 64 48 127
+Z 48 64 99 127
+z 48 64 99 127
+! 99 64 119 127
+? 119 64 157 127
+- 157 64 188 127
+: 188 64 205 127
+; 205 64 226 127
+
+0 0 128 45 191
+1 45 128 75 191
+2 75 128 118 191
+3 118 128 158 191
+4 158 128 203 191
+5 203 128 245 191
+
+6 0 192 41 255
+7 41 192 86 255
+8 86 192 127 255
+9 127 192 169 255
diff --git a/kscreensaver/kdesavers/data/kfs_letters1.png b/kscreensaver/kdesavers/data/kfs_letters1.png
new file mode 100644
index 00000000..2f6678ba
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_letters1.png
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_letters2.png b/kscreensaver/kdesavers/data/kfs_letters2.png
new file mode 100644
index 00000000..8d0442ac
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_letters2.png
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_particle.png b/kscreensaver/kdesavers/data/kfs_particle.png
new file mode 100644
index 00000000..d6294dc3
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_particle.png
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_particle_diastar.png b/kscreensaver/kdesavers/data/kfs_particle_diastar.png
new file mode 100644
index 00000000..6f645ddb
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_particle_diastar.png
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_particle_flare.png b/kscreensaver/kdesavers/data/kfs_particle_flare.png
new file mode 100644
index 00000000..4a4fdcb5
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_particle_flare.png
Binary files differ
diff --git a/kscreensaver/kdesavers/data/kfs_tux.png b/kscreensaver/kdesavers/data/kfs_tux.png
new file mode 100644
index 00000000..99f3465e
--- /dev/null
+++ b/kscreensaver/kdesavers/data/kfs_tux.png
Binary files differ
diff --git a/kscreensaver/kdesavers/firesaver.ChangeLog b/kscreensaver/kdesavers/firesaver.ChangeLog
new file mode 100644
index 00000000..98749856
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaver.ChangeLog
@@ -0,0 +1,106 @@
+2004-06-29 Enrico Ros <eros.kde@email.it>
+
+ * general : added support for 'per particle' texture with
+ smart binding. added 2 textures (explosion light / toxxic)
+
+ * firesaverparticle : finished TurningParticle class. moved
+ some code from the header to the cpp.
+
+ * firesaver : added 'Toxic spirals' fireworks, disabled
+ supernova in .ui since after 3.3. fixed monochrome<->monotype
+ bug.
+
+ * firesaverwriter : bugfix on word's color (blinking on start).
+
+2004-05-30 Enrico Ros <eros.kde@email.it>
+
+ * this file : renamed Changelog to firesaver.ChangeLog
+
+ * general : moved / renamed files and chaged stuff to get ready
+ to be imported into kdeartwork.
+
+ * general : all images are .png, all sounds are .ogg.
+
+2004-02-07 Enrico Ros <eros.kde@email.it>
+
+ * firesaver.cpp : implemented trail and alpha on explosions.
+
+ * firesaver : damn dirty bug! reordered projection lines. Looks
+ way cooler now. trimmed defaults.
+
+ * firesaversetup : config dialog redone from scratch. Now it is
+ more usable and ready for translation into different languages.
+ Also added many new features.
+
+ * firesaver : adapted to setup dialog changes (also embeds the
+ setup widget into a KDialogBase). Implemented some new features
+ added in the setup dialog.
+
+2004-02-06 Enrico Ros <eros.kde@email.it>
+
+ * all : optimized logic and math.. kcachegrind rules.
+
+ * firesaverparticle : inheritance test on particle class.
+ Implemented a "funny phisics" on the TurningParticle class. This
+ will lead to strange fireworks (spirals, fountains... )
+
+2004-01-31 Enrico Ros <eros.kde@email.it>
+
+ * all : leak checked and fixed uninitialized values. optimized
+ the code for less cpu consumption (reduced 7% over the 19% of
+ internal code cpu consumption (the remaining 81% of cpu time is
+ spent into GL libraries!!..) seems there's a limit to the code
+ optimization!).
+
+ * firesaver : added KDE icons as exploding elements and checked
+ the explode logo routine.
+
+ * fw_letters* : added support for overlay writings. cleaned api.
+
+ * firesaver.cpp/.h : implemented texture loader. some fixes and
+ a major speedup. again more changes to the graphical pipeline.
+
+2004-01-30 Enrico Ros <eros.kde@email.it>
+
+ * firesaverparticle.cpp/.h: cleaned a lot; changed the interface.
+ It's not completely decoupled from the 'firework' entity yet.
+
+ * fw_debris.ogg: added a second sound (used only on logo explosion
+ for now).
+
+ * firesaver.cpp: reworked the generation of image logos (new
+ default: 64x64 pixel for hi-res).
+
+2004-01-29 Enrico Ros <eros.kde@email.it>
+
+ * firesaver.cpp: fix: screen blink. add: particle size not
+ dependant from screen size.
+
+ * firesaver.cpp: optimized the rendering core for particles.
+ Computation takes now less than half of the time than before.
+ Set a capacity of 20000 simultaneous particles; more will be
+ dropped (but a progressive 'resize' is done..)
+
+ * fw_explode.ogg: converted sound file to ogg format.
+
+ * firesaver.cpp/.h: redone the audio engine (limited by default
+ to 4 mixer channels).
+
+ * firesaver.cpp: use the .mp3 sound that is "auto-mixed" by the
+ sound system. The old Wav was played sequentially (a boom is heard
+ after the previous one terminates). The Ogg format has the same
+ problem as the wave one (plus it goes on playing many booms after
+ the program is exited).
+
+2004-01-28 Enrico Ros <eros.kde@email.it>
+
+ * firesaverparticle.cpp: keep a particle independent from the
+ 'shape' of the firework it belongs to. Added depth (level) of
+ explosion (normal particles reach level 1, splitters reach 2).
+
+ * name syntax: converted filenames to match the style of the ones
+ in kdeartwork/kscreensaver/kdesavers.
+
+ * merging: merged some file's content to lower the number of files
+ before initial import.
+
diff --git a/kscreensaver/kdesavers/firesaver.cpp b/kscreensaver/kdesavers/firesaver.cpp
new file mode 100644
index 00000000..fff07dde
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaver.cpp
@@ -0,0 +1,1151 @@
+// This file is part of KFireSaver3D.
+
+// KFireSaver3D is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+
+// KFireSaver3D is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with KFireSaver3D; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver)
+// Email: asy@libero.it
+
+#include <math.h>
+#include <sys/time.h>
+#include <stdlib.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <arts/kmedia2.h>
+#include <arts/kplayobject.h>
+#include <arts/kplayobjectfactory.h>
+
+#include "firesaversetup.h"
+#include "firesaverparticle.h"
+#include "firesaverwriter.h"
+#include "firesaver.h"
+
+
+/* Factory code for KScreensaver begins *here* *\
+\* */
+
+#include <kscreensaver.h>
+#include <kdialogbase.h>
+
+class KFireSaverKSS : public KScreenSaver
+{
+ public:
+ KFireSaverKSS( WId id )
+ : KScreenSaver( id )
+ {
+ setBackgroundColor( black );
+ erase();
+ saver = new KFireSaver;
+ embed(saver);
+ saver->show();
+ }
+
+ ~KFireSaverKSS()
+ {
+ delete saver;
+ }
+
+ private:
+ KFireSaver* saver;
+};
+
+class KFireSaverSetupKDB : public KDialogBase
+{
+ public:
+ KFireSaverSetupKDB( QWidget* parent = 0, const char* name = 0 )
+ : KDialogBase( parent, name, true, i18n("Setup Screen Saver"),
+ Ok | Cancel | Help, Ok, true )
+ {
+ setup = new KFireSaverSetup( this );
+ setMainWidget( setup );
+ setButtonText( KDialogBase::Help, i18n( "A&bout" ) );
+ }
+
+ private slots:
+ void slotHelp()
+ {
+ KMessageBox::about(this, i18n("<h3>KFireSaver 3D 1.0</h3>\n<p>TEST Koral - Enrico Ros::2004</p>") );
+ }
+ void slotOk()
+ {
+ setup->writeConfig();
+ accept();
+ }
+
+ private:
+ KFireSaverSetup * setup;
+};
+
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kfiresaver.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Fireworks 3D (GL)" );
+ KDE_EXPORT const char *kss_version = "0.7";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KFireSaverKSS( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KFireSaverSetupKDB;
+ }
+}
+
+/* *\
+\* Factory code for KScreensaver ends *here* */
+
+
+KFireSaver :: KFireSaver( QWidget *parent, const char *name )
+ : QGLWidget( parent, name )
+{
+ // set random seed to initialize drand48() calls
+ timeval tv;
+ gettimeofday(&tv,NULL);
+ srand48( (long)tv.tv_usec );
+
+ readConfig();
+
+ particleList.setAutoDelete(true);
+ starList.setAutoDelete(true);
+ imageList.setAutoDelete(true);
+ playObjectList.setAutoDelete(true);
+
+ //initialize openGL context before managing GL calls
+ makeCurrent();
+ loadTexture( locate("data","kfiresaver/kfs_particle.png"), particleTexture );
+ loadTexture( locate("data","kfiresaver/kfs_particle_flare.png"), flareTexture );
+ loadTexture( locate("data","kfiresaver/kfs_particle_diastar.png"), diastarTexture );
+ starTexture = particleTexture;
+
+ //generate stars
+ if (parameters.enableStars) {
+ int number = parameters.starsNumber + 1;
+ number *= 10 * number;
+ for (int i=0 ; i<number ; i++)
+ {
+ Particle * star = new Particle( Particle::StarParticle );
+ star->initializeValues();
+ star->texture = starTexture;
+ if (parameters.enableStarGradient)
+ {
+ GLfloat red = star->colour[0],
+ green = star->colour[1],
+ blue = star->colour[2],
+ tint = 0.5 + star->ypos / FIELDWIDTH,
+ merge = 0.3 + DRAND*0.7,
+ mergen = 1 - merge;
+ star->colour[0] = red * merge + (1.0-tint) * mergen;
+ star->colour[1] = green * merge + tint * mergen;
+ star->colour[2] = blue * merge + tint * mergen;
+ }
+ starList.append( star );
+ }
+ }
+
+ //generate bottom fire
+ if (parameters.enableBottomFire) {
+ float cRed = (float)parameters.bottomFireColor.red() / 255.0,
+ cGreen = (float)parameters.bottomFireColor.green() / 255.0,
+ cBlue = (float)parameters.bottomFireColor.blue() / 255.0;
+ for (int i=0 ; i<NUMBER_OF_FIREPARTICLES ; i++)
+ {
+ Particle* particle = new Particle( Particle::FireParticle );
+ particle->initializeValues();
+ particle->texture = particleTexture;
+ particle->zspeed *= 4.0;
+ particle->colour[0] = cRed * (0.6 + 0.4*DRAND);
+ particle->colour[1] = cGreen * (0.6 + 0.4*DRAND);
+ particle->colour[2] = cBlue * (0.6 + 0.4*DRAND);
+ particleList.append(particle);
+ }
+ }
+
+ //get sound files
+ if (parameters.enableSound) {
+ sound_explosion = locate("data","kfiresaver/kfs_explode.ogg");
+ sound_debris = locate("data","kfiresaver/kfs_debris.ogg");
+ }
+
+ //create the writer class that manages flying writings.
+ if ( parameters.enableWritings )
+ writer = new Writer("kfs_letters.desc");
+
+ showp.forceBicolour =
+ showp.forceColour =
+ showp.forcePower =
+ showp.forceType = false;
+ showp.timeStamp = 0.0;
+ startTimer(MSECPERIOD);
+
+ //force initialization of "show" variables for the first time
+ timerEvent(NULL);
+}
+
+
+KFireSaver :: ~KFireSaver()
+{
+ freeTexture( particleTexture );
+ freeTexture( starTexture );
+ particleList.clear();
+ starList.clear();
+ imageList.clear();
+ playObjectList.clear();
+ if ( parameters.enableWritings )
+ delete writer;
+}
+
+
+void KFireSaver :: initializeGL()
+{
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ glShadeModel( GL_SMOOTH );
+
+ resizeGL( 640, 480 );
+}
+
+
+void KFireSaver :: resizeGL( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho( -FIELDW_2, FIELDW_2, -FIELDW_2, FIELDW_2, 5.0, 60.0 );
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ float ratio = (float)width / (float)height,
+ numH = 750 - 90 * parameters.particleSize,
+ numW = 1000 - 120 * parameters.particleSize;
+ if ( ratio >= (4.0/3.0) ) {
+ unitX = FIELDWIDTH / (numH * ratio);
+ unitY = FIELDWIDTH / numH;
+ } else {
+ unitX = FIELDWIDTH / numW;
+ unitY = FIELDWIDTH / (numW / ratio);
+ }
+
+ timeval tv;
+ gettimeofday(&tv,NULL);
+ timeStampFrame = (double)tv.tv_sec + (double)tv.tv_usec/1000000.0;
+
+ firstGLFrame = true;
+}
+
+
+void KFireSaver :: paintGL ()
+/* Main procedure. It does the following:
+ - calculate time diff between current and previous frame
+ - clear the color buffer
+ - simple render of stars
+ - advanced render of particles
+ - render
+ - update physics based on time difference
+ - check die/change conditions
+ - call to explode_firework if a leader dies
+ - if random -> start a new firework
+ - if random -> explode a penquin or kde logo
+*/
+{
+ /* calculate TIME ELAPSED between current and previous frame */
+
+ timeval tv;
+ gettimeofday(&tv,NULL);
+ double timeCurrent = (double)tv.tv_sec + (double)tv.tv_usec/1000000.0;
+ double timeDiff = (MSECPERIOD / 1000.0);
+ if (parameters.enableRealtime)
+ {
+ timeDiff = timeCurrent - timeStampFrame;
+ timeStampFrame = timeCurrent;
+ timeDiff = (timeDiff > 0.5) ? 0.5 : (timeDiff < 0.005) ? 0.005 : timeDiff;
+ }
+
+ /* CLEAR SCREEN: to do it there are 2 ways */
+
+ glLoadIdentity();
+ glTranslatef( 0, 0, -50.0 );
+ glDisable( GL_TEXTURE_2D );
+
+ if ( !parameters.enableFade || firstGLFrame )
+ { // quick - clear the OpenGL color buffer
+ glClearColor( 0.0, 0.0, 0.0, 1.0 );
+ glClear( GL_COLOR_BUFFER_BIT );
+ firstGLFrame = false;
+ }
+ else
+ { // good looking
+ /* superpose a semi-transparent black rectangle so we
+ can see a sort of 'tail' for each particle drawn. */
+ const GLfloat conv_tab[10] = {
+ 0.50, 0.33, 0.22, 0.15, 0.10,
+ 0.07, 0.05, 0.03, 0.02, 0.01 };
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(0.0,0.0,0.0, conv_tab[parameters.fadeAmount]);
+ glBegin( GL_TRIANGLE_STRIP );
+ glVertex2f( FIELDW_2, FIELDW_2 );
+ glVertex2f( -FIELDW_2, FIELDW_2 );
+ glVertex2f( FIELDW_2, -FIELDW_2 );
+ glVertex2f( -FIELDW_2, -FIELDW_2 );
+ glEnd();
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+ }
+
+ /* render STARS */
+
+ if (parameters.enableStars) {
+ if ( starTexture ) {
+ glEnable( GL_TEXTURE_2D );
+ glBindTexture( GL_TEXTURE_2D, currentTexture = starTexture );
+ } else
+ glDisable( GL_TEXTURE_2D );
+
+ glBegin( GL_QUADS );
+ bool flickers = parameters.enableStarFlickering;
+ float alpha = flickers ? 0.5 : 1.0;
+ Particle * star = starList.first();
+ for (; star; star = starList.next())
+ {
+ if (flickers && DRAND<0.6)
+ continue;
+
+ GLfloat sizeX = star->pixelSize * unitX,
+ sizeY = star->pixelSize * unitY,
+ pLeft = star->xpos - sizeX,
+ pRight = star->xpos + sizeX,
+ pTop = star->ypos + sizeY,
+ pBottom = star->ypos - sizeY;
+ glColor4f(star->colour[0], star->colour[1], star->colour[2], alpha);
+ glTexCoord2f( 0, 0 ); // Bottom Left
+ glVertex2f( pLeft, pBottom );
+ glTexCoord2f( 0, 1 ); // Top Left
+ glVertex2f( pLeft, pTop );
+ glTexCoord2f( 1, 1 ); // Top Right
+ glVertex2f( pRight, pTop );
+ glTexCoord2f( 1, 0 ); // Bottom Right
+ glVertex2f( pRight, pBottom );
+ }
+ glEnd();
+ }
+
+ /* render FIREWORKS */
+
+ glBegin( GL_QUADS );
+ bool playedExplodeSound = false;
+ bool flashedScreen = false;
+ Particle * particle = particleList.first();
+ for (; particle; particle = particleList.next())
+ {
+ //bind the texture for current particle (if not already bound)
+ if ( !particle->texture ) {
+ glEnd();
+ glDisable( GL_TEXTURE_2D );
+ glBegin( GL_QUADS );
+ currentTexture = 0;
+ } else if ( particle->texture != currentTexture ) {
+ glEnd();
+ glEnable( GL_TEXTURE_2D );
+ glBindTexture( GL_TEXTURE_2D, currentTexture = particle->texture );
+ glBegin( GL_QUADS );
+ }
+
+ //perspective projection (done by hand to make it funnier than opengl's :-)
+ float mfactor = PERSP_MAG_FACTOR * particle->ypos;
+ if ( mfactor < -246.0 ) {
+ particleList.remove();
+ particleList.prev();
+ continue;
+ }
+ float sfactor = 256.0 / (256.0 + mfactor),
+ posx = sfactor * particle->xpos,
+ posy = sfactor * particle->zpos - 4.0;
+ //size computation (magnify if enableMegaFlares is set)
+ if ( parameters.enableMegaFlares ) {
+ mfactor = parameters.megaFlares*particle->ypos;
+ if ( mfactor < -255.0 || mfactor > 512.0 ) {
+ particleList.remove();
+ particleList.prev();
+ continue;
+ }
+ sfactor = 256.0 / (256.0 + mfactor);
+ if ( sfactor > 64 )
+ sfactor = 76.8 - sfactor / 5.0;
+ }
+ float size = sfactor * particle->pixelSize,
+ sizeX = size * unitX,
+ sizeY = size * unitY;
+
+ //determine brightness (alpha component) for the particle
+ if ( particle->useLife ) {
+ float life = particle->life,
+ startLife = particle->startLife;
+ //bright changes with the following curve: "2*k - k^2" (or "k(2-k)")
+ if ( life > startLife )
+ particle->colour[3] = startLife + 1 - life;
+ else
+ particle->colour[3] = life / startLife;
+ //apply flickering if enabled
+ if (particle->flicker < 0) {
+ particle->colour[3] = 0.2;
+ if (++particle->flicker >= 0)
+ particle->flicker = FLICKER_FRAMES_DELAY;
+ } else if (particle->flicker > 0) {
+ if ( life <= startLife )
+ particle->colour[3] = 1.0;
+ if (--particle->flicker <= 0)
+ particle->flicker = -FLICKER_FRAMES_DELAY;
+ }
+ glColor4fv( particle->colour );
+ } else
+ glColor3fv( particle->colour );
+
+ //draw particle
+ float pLeft = posx - sizeX,
+ pTop = posy + sizeY,
+ pRight = posx + sizeX,
+ pBottom = posy - sizeY;
+ glTexCoord2f( 0, 0 ); // Bottom Left
+ glVertex2f( pLeft, pBottom );
+ glTexCoord2f( 0, 1 ); // Top Left
+ glVertex2f( pLeft, pTop );
+ glTexCoord2f( 1, 1 ); // Top Right
+ glVertex2f( pRight, pTop );
+ glTexCoord2f( 1, 0 ); // Bottom Right
+ glVertex2f( pRight, pBottom );
+
+ //phisically update parameters of the particle
+ particle->updateParameters( timeDiff );
+
+ //check for particle death / explosion
+ switch (particle->particleType)
+ {
+ //a Fireparticle is restarted when in right conditions
+ case Particle::FireParticle:
+ if ( posx < -FIELDW_2 || posx > FIELDW_2 ||
+ (particle->zpos < -10.0 && posy < -FIELDW_2) )
+ {
+ particle->initializeValues();
+ if ( DRAND > 0.9995 )
+ particle->zspeed *= 4;
+ }
+ break;
+
+ //a leader explodes when his z speed drops to zero
+ //or, if it uses life, at death
+ case Particle::FireWorkLeaderParticle:
+ if ((particle->zspeed <= 0.0f && !particle->useLife) ||
+ (particle->useLife && particle->life <= 0.0) )
+ {
+ // play sound if enabled (and once per frame)
+ if (parameters.enableSound && !playedExplodeSound)
+ {
+ playSound(sound_explosion);
+ playedExplodeSound = true;
+ }
+ // flash screen if enabled
+ if (parameters.enableFlash && !flashedScreen) {
+ glEnd();
+ glDisable( GL_TEXTURE_2D );
+ glColor4f( 1,1,1, parameters.flashOpacity / 10.0 );
+ glBegin( GL_TRIANGLE_STRIP );
+ glVertex2f( FIELDW_2, FIELDW_2 );
+ glVertex2f( -FIELDW_2, FIELDW_2 );
+ glVertex2f( FIELDW_2, -FIELDW_2 );
+ glVertex2f( -FIELDW_2, -FIELDW_2 );
+ glEnd();
+ if ( particleTexture )
+ glEnable( GL_TEXTURE_2D );
+ glBegin( GL_QUADS );
+ flashedScreen = true;
+ }
+ // generating children and removing parent
+ int elementIndex = particleList.at();
+ explodeFirework(particle);
+ particleList.remove(elementIndex);
+ particleList.prev();
+ } else if ( parameters.enableTrails && DRAND < 0.4 ) {
+ // leave trail behind the particle (it'a small and slow red debris)
+ Particle * p = new Particle( Particle::FireWorkDebrisParticle );
+ p->initializeValues( 0, particle, 1, 1 );
+ p->texture = particleTexture;
+ p->xspeed /= 4;
+ p->yspeed /= 4;
+ p->zspeed /= 8;
+ p->zacc /= 4;
+ p->pixelSize = 2;
+ p->colour[0] /= 2;
+ int elementIndex = particleList.at();
+ particleList.append( p );
+ particleList.at( elementIndex );
+ }
+ break;
+
+ //remove if dead or outside field
+ default:
+ if (particle->life <= 0.0 || posx<-FIELDW_2 || posx>FIELDW_2 || posy<-FIELDW_2) {
+ particleList.remove();
+ particleList.prev();
+ }
+ break;
+ }
+ }
+ glEnd();
+
+ /* render WRITINGS */
+
+ if ( parameters.enableWritings )
+ {
+ int chance = (int) (1000.0 * DRAND);
+ if ( !chance ) {
+ static const QString someStrings[] = {
+ i18n("www.kde.org"),
+ i18n("My KDE, please!"),
+ i18n("KoNqUeR the World"),
+ i18n("KFIRESAVER 3D"),
+ i18n("Gimme your eyes..."),
+ i18n("Thank you for using KDE"),
+ i18n("Going insane tonight"),
+ };
+ int n = (int)(6.0 * DRAND);
+ writer->spawnWords( someStrings[n], Writer::Fun1 );
+ }
+ writer->render( timeDiff );
+ }
+
+ /* generate a new FIREWORK_LEADER */
+
+ int random = (int) ((float)parameters.fireworksFrequency * DRAND);
+ if (showp.ShowType == Show)
+ {
+ //double the chances ('frequency') to raise a new leaderParticle
+ //but envelop it under a sine function
+ float step = (showp.timeStamp - timeCurrent) / showp.timeGap;
+ if (DRAND > sin(M_PI*step))
+ random = -1;
+ if (showp.type == AngelHairs && DRAND < 0.5)
+ random = -1;
+ }
+ if ( !random )
+ {
+ Particle * particle = new Particle( Particle::FireWorkLeaderParticle );
+ particle->initializeValues();
+ particle->texture = flareTexture;
+ particleList.append( particle );
+ }
+
+ /* explode a logo */
+
+ int logoImages = imageList.count();
+ if ( logoImages > 0 ) {
+ random = (int) (parameters.logoFrequency * logoImages * 200.0 * DRAND);
+ if ( random < logoImages )
+ {
+ if (parameters.enableFlash && !flashedScreen) {
+ glDisable( GL_TEXTURE_2D );
+ glColor4f( 1,1,1, parameters.flashOpacity / 10.0 );
+ glBegin( GL_TRIANGLE_STRIP );
+ glVertex2f( FIELDW_2, FIELDW_2 );
+ glVertex2f( -FIELDW_2, FIELDW_2 );
+ glVertex2f( FIELDW_2, -FIELDW_2 );
+ glVertex2f( -FIELDW_2, -FIELDW_2 );
+ glEnd();
+ }
+ burnLogo( imageList.at(random) );
+ }
+ }
+}
+
+
+int KFireSaver :: pickColour()
+{
+ int color = (int) (DRAND * parameters.colorsCount);
+ return parameters.colorsT[ color ];
+}
+
+
+KFireSaver :: enumFireworkType KFireSaver :: pickType()
+{
+ int type = (int) (DRAND * parameters.typesCount);
+ return parameters.typesT[ type ];
+}
+
+
+void KFireSaver :: explodeFirework(Particle* leaderParticle)
+{
+ GLfloat displace[3] = {0.0,0.0,0.0};
+ float tmp1 = 0.0, tmp2 = 0.0, tmp3 = 0.0, tmp4 = 0.0, tmp5 = 0.0;
+
+ // color of exploded particles
+ bool bicolor = parameters.enableCombos && (showp.forceBicolour || DRAND > 0.95),
+ flickers = false;
+ int cscheme = showp.forceColour ? showp.colour : pickColour(),
+ cscheme2 = showp.forceColour ? showp.colourSec : pickColour();
+
+ // randomize type of exploding firework
+ enumFireworkType fwType =
+ showp.forceType ? (enumFireworkType) showp.type : pickType();
+
+ // other options for generated particles
+ int number = (int) ((DRAND + DRAND) * 150.0);
+ float power = showp.forcePower ?
+ showp.powerEnvelop * (0.8 + 0.3*DRAND) :
+ DRAND * 11.0 + 2.0,
+ powermin = DRAND * power;
+
+ // now some rules ...
+ //a splitter can't split up more than 2 times
+ if (fwType == Splitter && leaderParticle->explosionsDepth > 1) {
+ if (parameters.typesCount == 1)
+ return;
+ if (showp.forceType)
+ fwType = showp.typeSec;
+ if (fwType == Splitter)
+ while ( (fwType = pickType()) == Splitter );
+ }
+
+ // PRE-ADJUST parameters for the firework we're creating
+ switch ( fwType )
+ {
+ //no need to handle this. it's the default configuration.
+ case Sphere:
+ break;
+
+ //explosion whithout emitting particles, only a flash
+ case NoFW:
+ number = 1;
+ power = powermin = 0;
+ break;
+
+ //splits up into 'number' orange pieces. tmp1 holds base_life
+ case Splitter:
+ cscheme = showp.forceColour ? showp.colour : 1;
+ bicolor = false;
+ number = 3 + (int) (DRAND * 4);
+ power /= 2.0;
+ powermin = power / 2.0;
+ tmp1 = 0.4 + DRAND * 1.5;
+ break;
+
+ //randomize a couple of angles (phi - theta) for exploding circle
+ case BiCircle:
+ number *= 2;
+ case Circle:
+ power = DRAND * 5.0 + 4.0;
+ tmp1 = DRAND * M_PI;
+ tmp2 = DRAND * M_PI;
+ tmp4 = cos(tmp2); //c2
+ tmp3 = sin(tmp2); //s2
+ tmp2 = cos(tmp1); //c1
+ tmp1 = sin(tmp1); //s1
+ break;
+
+ //cascade of flickering orange particles
+ case AngelHairs:
+ cscheme = showp.forceColour ? showp.colour : 1;
+ bicolor = false;
+ flickers = true;
+ power = 0.8 + DRAND * 1.9;
+ powermin = DRAND*0.5;
+ number = 100 + (int)(DRAND * 150);
+ displace[0] = -leaderParticle->xspeed/2;
+ displace[1] = -leaderParticle->yspeed/2;
+ displace[2] = power;
+ break;
+
+ //behave as a standard spherical firework
+ case Spirals:
+ break;
+
+ //not yet implemented, suppressing particles
+ case SuperNova:
+ case NoRender:
+ number = 0;
+ break;
+ }
+
+ //limit number of particles as we are getting to the capacity saturation
+ float currentParticles = (float) particleList.count();
+ const float particleCapacity = 15000;
+ const float particleGap = 8000;
+ if ( number > 10 && currentParticles > (particleCapacity - particleGap) )
+ {
+ //NoFW, Splitter and NoRender aren't limited.
+ number = (int)( (float)number * (particleCapacity - currentParticles) / particleGap );
+ if ( number < 10 )
+ number = 0;
+ }
+
+ int newExplosionsDepth = leaderParticle->explosionsDepth + 1;
+ for (int i=0 ; i<number ; i++)
+ {
+ Particle * particle;
+ if ( fwType == Spirals )
+ particle = new TurningParticle( Particle::FireWorkDebrisParticle );
+ else
+ particle = new Particle( Particle::FireWorkDebrisParticle );
+
+ particle->initializeValues (
+ bicolor && (i>number/2) ? cscheme2 : cscheme,
+ leaderParticle, powermin, power,
+ flickers, displace );
+ particle->texture = particleTexture;
+ particle->explosionsDepth = newExplosionsDepth;
+
+ // POST-ADJUST particle coefficients adapting to current FireworkType
+ switch ( fwType )
+ {
+ //create a big, white particle, simulating explosion
+ case NoFW:
+ if (parameters.enableFade)
+ particle->startLife = particle->life = 0.030;
+ else
+ particle->startLife = particle->life = 0.075;
+ particle->texture = flareTexture;
+ particle->colour[0]=
+ particle->colour[1]=
+ particle->colour[2]=1.0;
+ particle->pixelSize = 50.0 + 75.0 * DRAND;
+ particle->zacc = 0;
+ break;
+
+ //default. no need to change parameters, only create the
+ //'sphere light' as the first big particle if set.
+ case Sphere:
+ if (i==0 && parameters.enableSphereLight && number > 40) {
+ particle->texture = flareTexture;
+ particle->xspeed = leaderParticle->xspeed;
+ particle->yspeed = leaderParticle->yspeed;
+ particle->zspeed = 0.0;
+ particle->colour[0] /= 2.0;
+ particle->colour[1] /= 2.0;
+ particle->colour[2] /= 2.0;
+ float impression = power * (float)number/5.0;
+ particle->pixelSize = 25.0 * DRAND + impression;
+ if (parameters.enableFade) {
+ particle->startLife = particle->life = 0.040;
+ } else {
+ particle->startLife = 1.3;
+ particle->life = 1.8;
+ }
+ }
+ break;
+
+ //
+ case Splitter:
+ particle->particleType = Particle::FireWorkLeaderParticle;
+ particle->pixelSize *= 3.0;
+ particle->startLife = particle->life = tmp1 * (0.75 + DRAND/3.0);
+ if (particle->zspeed < 0)
+ particle->zspeed = -particle->zspeed;
+ break;
+
+ case Circle:
+ case BiCircle:
+ tmp5 = 2 * M_PI * DRAND;
+ //MMX can be useful.. if you know how to use it :-)
+ if ( fwType == BiCircle && i > number/2 ) {
+ GLfloat ey = cos(tmp5),
+ ez = sin(tmp5);
+ particle->xspeed = power * ( tmp3*ez );
+ particle->yspeed = power * ( tmp2*ey - tmp1*tmp4*ez );
+ particle->zspeed = power * ( tmp1*ey + tmp2*tmp4*ez );
+ } else {
+ GLfloat ex = sin(tmp5),
+ ey = cos(tmp5);
+ particle->xspeed = power * ( tmp4*ex );
+ particle->yspeed = power * ( tmp1*tmp3*ex + tmp2*ey );
+ particle->zspeed = power * ( -tmp2*tmp3*ex + tmp1*ey );
+ }
+ break;
+
+ case AngelHairs:
+ particle->zacc = -9.807 * (0.05 + DRAND*0.20);
+ particle->life = 2.0 + DRAND*2.5;
+ particle->startLife = particle->life - 1;
+ if (particle->zspeed < 0)
+ particle->zspeed *= -1;
+ //particle->pixelSize = 5.0;
+ break;
+
+ case Spirals:
+ particle->texture = diastarTexture;
+ break;
+
+ //discard cases
+ case SuperNova:
+ case NoRender:
+ break;
+ }
+ particleList.append(particle);
+ }
+}
+
+void KFireSaver :: timerEvent(QTimerEvent*)
+{
+ timeval tv;
+ gettimeofday(&tv,NULL);
+ double currentTime = (double)tv.tv_sec + (double)tv.tv_usec/1000000.0;
+
+ bool chooseType = false,
+ chooseColor = false,
+ chooseOthers = false,
+ updateTimings = false;
+ bool firstTime = showp.timeStamp == 0.0;
+ bool endOfScene = currentTime >= showp.timeStamp;
+
+ if (firstTime)
+ switch (showp.ShowType)
+ {
+ case Monotype:
+ /* first time choose the type, color and attributes will
+ be choosed randomly for every firework which explodes*/
+ showp.forceType = true;
+ chooseType = true;
+ break;
+
+ case Monochrome:
+ /* first time choose the color, type and attributes will
+ be choosed randomly for every firework which explodes*/
+ showp.forceColour = true;
+ chooseColor =
+ chooseOthers = true;
+ break;
+
+ default: break;
+ }
+
+ if (endOfScene || firstTime)
+ switch (showp.ShowType)
+ {
+ case Show:
+ /* if a scene ended, randomize global parameters for the
+ whole next scene */
+ showp.forceType = true;
+ showp.forceColour = true;
+ showp.forcePower = true;
+ chooseOthers =
+ chooseColor =
+ chooseType = true;
+ updateTimings = true;
+ break;
+
+ default: break;
+ }
+
+ if ( chooseType )
+ {
+ showp.type = pickType();
+ if (parameters.typesCount < 2)
+ showp.typeSec = NoRender;
+ else
+ while ((showp.typeSec = pickType()) == showp.type);
+ }
+ if ( chooseColor ) {
+ showp.colour = pickColour();
+ showp.colourSec = pickColour();
+ }
+ if ( chooseOthers )
+ {
+ showp.powerEnvelop = DRAND * 8.0 + 3.0;
+ if (DRAND > 0.9)
+ {
+ showp.forceBicolour = true;
+ showp.colourSec = pickColour();
+ } else
+ showp.forceBicolour = false;
+ }
+ if ( firstTime || updateTimings )
+ {
+ if (DRAND < 0.2)
+ showp.timeGap = 1.0 + DRAND * 2.0;
+ else
+ showp.timeGap = 3.0 + DRAND * 10.0;
+ showp.timeStamp = currentTime + showp.timeGap;
+ showp.timeGap /= 1.5; //hack to introduce delay in sine func
+ }
+
+ updateGL();
+}
+
+void KFireSaver :: burnLogo(QImage * image)
+{
+ if (!image || image->isNull())
+ return;
+ int step = parameters.enableReduceLogo ? 2 : 1,
+ imageW = image->width(),
+ imageH = image->height(),
+ offsetX = imageW / 2,
+ offsetY = imageH / 2;
+ float speed = FIELDW_4 / (imageW > imageH ? imageW : imageH),
+ speedXOffs = 5 * (DRAND - DRAND),
+ speedYOffs = DRAND + DRAND + 1;
+ //if image is too big, lower sample points
+ while ((imageW/step)>96 || (imageH/step)>96)
+ step *= 2;
+ for (int y=0 ; y<imageH ; y+=step)
+ {
+ for (int x=0 ; x<imageW ; x+=step)
+ {
+ QRgb pixel = image->pixel(x,y);
+ if ( qAlpha(pixel) < 250 )
+ continue;
+ //if ( DRAND > 0.9 )
+ // continue;
+
+ Particle* particle = new Particle( Particle::LogoParticle );
+ particle->initializeValues();
+ particle->texture = particleTexture;
+
+ float xI = (x - offsetX) ,
+ yI = (offsetY - y) ;
+ particle->xpos = xI * speed * 0.5;
+ particle->zpos = yI * speed * 0.5 + 5;
+ particle->xspeed = xI * speed + speedXOffs;
+ particle->zspeed = yI * speed + speedYOffs;
+
+ particle->colour[0] = qRed(pixel) / 255.0f;
+ particle->colour[1] = qGreen(pixel) / 255.0f;
+ particle->colour[2] = qBlue(pixel) / 255.0f;
+
+ particleList.append(particle);
+ }
+ }
+ if (parameters.enableSound)
+ playSound(sound_debris);
+}
+
+void KFireSaver :: playSound(QString file)
+{
+ //flush inactive players
+ KPlayObject * playObject = playObjectList.first();
+ while ( playObject )
+ {
+ if ( playObject->state() != Arts::posPlaying )
+ {
+ playObjectList.remove();
+ playObject = playObjectList.current();
+ } else
+ playObject = playObjectList.next();
+ }
+
+ //discart this sound if the player queue is already full (4 channels playing)
+ if ( playObjectList.count() >= 6 )
+ return;
+
+ // not needed when all of the files are in the distribution
+ //if (!QFile::exists(file))
+ //return;
+
+ KPlayObjectFactory factory(artsServer.server());
+ playObject = factory.createPlayObject(KURL(file), true);
+
+ if (playObject && !playObject->isNull())
+ {
+ playObject->play();
+ playObjectList.append(playObject);
+ }
+}
+
+bool KFireSaver :: loadTexture( QString fileName, unsigned int & textureID )
+{
+ //reset texture ID to the default EMPTY value
+ textureID = 0;
+
+ //load image
+ QImage tmp;
+ if ( !tmp.load( fileName ) )
+ return false;
+
+ //convert it to suitable format (flipped RGBA)
+ QImage texture = QGLWidget::convertToGLFormat( tmp );
+ if ( texture.isNull() )
+ return false;
+
+ //get texture number and bind loaded image to that texture
+ glGenTextures( 1, &textureID );
+ glBindTexture( GL_TEXTURE_2D, textureID );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexImage2D( GL_TEXTURE_2D, 0, 4 /* 3 ??? */, texture.width(), texture.height(),
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.bits() );
+ return true;
+}
+
+void KFireSaver :: freeTexture( unsigned int & textureID )
+{
+ if ( textureID > 0 )
+ glDeleteTextures( 1, &textureID );
+ textureID = 0;
+}
+
+void KFireSaver :: readConfig ()
+{
+ KConfig config("kfiresaverrc",true,false);
+
+ // show
+ config.setGroup( "Show" );
+ showp.ShowType = (enum enumShowType)config.readNumEntry( "ShowType", 1 );
+ parameters.fireworksFrequency = 11 - config.readNumEntry( "FireworksFrequency", 7 );
+ if ( parameters.fireworksFrequency < 1 )
+ parameters.fireworksFrequency = 1;
+ if ( parameters.fireworksFrequency > 11 )
+ parameters.fireworksFrequency = 11;
+ parameters.fireworksFrequency *= (parameters.fireworksFrequency + 1); //*karl gauss's sum*
+ parameters.particleSize = config.readNumEntry( "ParticlesSize", 0 );
+ if ( parameters.particleSize < -5 )
+ parameters.particleSize = -5;
+ if ( parameters.particleSize > 5 )
+ parameters.particleSize = 5;
+ if ( parameters.enableBottomFire = config.readBoolEntry( "enable-BottomFire", true ) )
+ {
+ QColor blue = Qt::darkBlue;
+ parameters.bottomFireColor = config.readColorEntry( "BottomFireColor", &blue );
+ }
+ parameters.enableSound = config.readBoolEntry( "enable-Sounds", false );
+ parameters.enableNoOverhead = config.readBoolEntry( "enable-NoOverhead", true );
+ parameters.enableRealtime = config.readBoolEntry( "enable-FrameSkip", true );
+
+ // fireworks
+ config.setGroup( "Fireworks" );
+ parameters.typesCount = 0;
+ if ( config.readBoolEntry( "use-Classic", true ) )
+ parameters.typesT[parameters.typesCount++] = Sphere;
+ if ( config.readBoolEntry( "use-Explosion", false ) )
+ parameters.typesT[parameters.typesCount++] = NoFW;
+ if ( config.readBoolEntry( "use-FlameRing", false ) )
+ parameters.typesT[parameters.typesCount++] = Circle;
+ if ( config.readBoolEntry( "use-FlameWorld", false ) )
+ parameters.typesT[parameters.typesCount++] = BiCircle;
+ if ( config.readBoolEntry( "use-Fall", false ) )
+ parameters.typesT[parameters.typesCount++] = AngelHairs;
+ if ( config.readBoolEntry( "use-Splitter", false ) )
+ parameters.typesT[parameters.typesCount++] = Splitter;
+ if ( config.readBoolEntry( "use-Spirals", false ) )
+ parameters.typesT[parameters.typesCount++] = Spirals;
+ if ( config.readBoolEntry( "use-SuperNova", false ) )
+ parameters.typesT[parameters.typesCount++] = SuperNova;
+ if ( !parameters.typesCount ) {
+ kdWarning() << "KFireSaver3D: Warning, no fireworks enabled in config file" << endl;
+ kdWarning() << " enabling 'Classic Spherical'" << endl;
+ parameters.typesCount = 1;
+ parameters.typesT[0] = Sphere;
+ }
+ parameters.typesT[ parameters.typesCount ] =
+ parameters.typesT[ parameters.typesCount-1 ];
+ parameters.colorsCount = 0;
+ if ( config.readBoolEntry( "use-Red", false ) )
+ parameters.colorsT[parameters.colorsCount++] = 0;
+ if ( config.readBoolEntry( "use-Orange", true ) )
+ parameters.colorsT[parameters.colorsCount++] = 1;
+ if ( config.readBoolEntry( "use-Green", false ) )
+ parameters.colorsT[parameters.colorsCount++] = 2;
+ if ( config.readBoolEntry( "use-Blue", false ) )
+ parameters.colorsT[parameters.colorsCount++] = 3;
+ if ( config.readBoolEntry( "use-White", true ) )
+ parameters.colorsT[parameters.colorsCount++] = 4;
+ if ( config.readBoolEntry( "use-Purple", false ) )
+ parameters.colorsT[parameters.colorsCount++] = 5;
+ if ( config.readBoolEntry( "use-DeepGreen", true ) )
+ parameters.colorsT[parameters.colorsCount++] = 6;
+ if ( !parameters.colorsCount )
+ {
+ kdWarning() << "KFireSaver3D: Warning enable at least one color" << endl;
+ kdWarning() << " enabling 'Blinding White'" << endl;
+ parameters.colorsCount = 1;
+ parameters.colorsT[0] = 4;
+ }
+ parameters.colorsT[ parameters.colorsCount ] =
+ parameters.colorsT[ parameters.colorsCount-1 ];
+ parameters.enableCombos = config.readBoolEntry( "use-Multicolor", true );
+
+ // specials
+ config.setGroup( "Specials" );
+ if ( parameters.enableLogos = config.readBoolEntry( "enable-Logos", true ) )
+ {
+ QImage tempImage;
+ tempImage.setAlphaBuffer( true );
+ if ( config.readBoolEntry( "LogosTux", true ) )
+ if ( tempImage.load(locate("data","kfiresaver/kfs_tux.png")) )
+ imageList.append( new QImage(tempImage) );
+ if ( config.readBoolEntry( "LogosKonqui", true ) )
+ if ( tempImage.load(locate("data","kfiresaver/kfs_kde.png")) )
+ imageList.append( new QImage(tempImage) );
+ if ( config.readBoolEntry( "LogosKDEIcons", true ) ) {
+ const QString icons[] = {
+ "3floppy_unmount", "cdrom_unmount", "hdd_mount", "kmix",
+ "network", "my-computer", "folder_home", "konqueror",
+ "kmail", "penguin", "personal" };
+ for ( int i = 0; i < 11; i++ )
+ imageList.append( new QImage(DesktopIcon(icons[i],64).convertToImage()) );
+ }
+ parameters.enableReduceLogo = config.readBoolEntry( "LogosReduceDetail", true );
+ parameters.logoFrequency = 11 - config.readNumEntry( "LogosFrequency", 4 );
+ if ( parameters.logoFrequency < 1 )
+ parameters.logoFrequency = 1;
+ if ( parameters.logoFrequency > 11 )
+ parameters.logoFrequency = 11;
+ }
+ if ( parameters.enableStars = config.readBoolEntry( "enable-Stars", true ) )
+ {
+ parameters.enableStarFlickering = config.readBoolEntry( "StarsFlicker", false );
+ parameters.enableStarGradient = config.readBoolEntry( "StarsGradient", true );
+ parameters.starsNumber = config.readNumEntry( "StarsNumber", 4 );
+ if ( parameters.starsNumber < 0 )
+ parameters.starsNumber = 0;
+ if ( parameters.starsNumber > 10 )
+ parameters.starsNumber = 10;
+ }
+ parameters.enableWritings = config.readBoolEntry( "enable-Writings", true );
+
+ // effects
+ config.setGroup( "Effects" );
+ parameters.enableSphereLight = config.readBoolEntry( "enable-SphericalLight", true );
+ if ( parameters.enableFlash = config.readBoolEntry( "enable-Flash", false ) )
+ {
+ parameters.flashOpacity = config.readNumEntry( "FlashOpacity", 5 );
+ if ( parameters.flashOpacity < 0 )
+ parameters.flashOpacity = 0;
+ if ( parameters.flashOpacity > 10 )
+ parameters.flashOpacity = 10;
+ }
+ if ( parameters.enableFade = config.readBoolEntry( "enable-Fade", false ) )
+ {
+ parameters.fadeAmount = config.readNumEntry( "FadeIntensity", 3 );
+ if ( parameters.fadeAmount < 0 )
+ parameters.fadeAmount = 0;
+ if ( parameters.fadeAmount > 9 )
+ parameters.fadeAmount = 9;
+ }
+ if ( parameters.enableMegaFlares = config.readBoolEntry( "enable-Flares", true ) )
+ {
+ parameters.megaFlares = config.readNumEntry( "FlaresDimension", 5 );
+ if ( parameters.megaFlares < 0 )
+ parameters.megaFlares = 0;
+ if ( parameters.megaFlares > 10 )
+ parameters.megaFlares = 10;
+ parameters.megaFlares += 4;
+ parameters.megaFlares *= 2;
+ }
+ parameters.enableTrails = config.readBoolEntry( "enable-Trail", false );
+}
diff --git a/kscreensaver/kdesavers/firesaver.h b/kscreensaver/kdesavers/firesaver.h
new file mode 100644
index 00000000..3757b64b
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaver.h
@@ -0,0 +1,170 @@
+// This file is part of KFireSaver3D.
+
+// KFireSaver3D is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+
+// KFireSaver3D is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with KFireSaver3D; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver)
+// Email: asy@libero.it
+
+#ifndef KFIRESAVER_H
+#define KFIRESAVER_H
+
+#define PERSP_MAG_FACTOR 8.0
+#define NUMBER_OF_FIREPARTICLES 180
+
+#define MSECPERIOD 17 // 1000ms / 60fps = 16.6667 ~= 17 [ms/frame]
+
+#define FIELDWIDTH 30.0
+#define FIELDW_2 (FIELDWIDTH/2.0)
+#define FIELDW_4 (FIELDWIDTH/4.0)
+
+#include <qgl.h>
+#include <qptrlist.h>
+#include <qimage.h>
+#include <qstring.h>
+#include <qcolor.h>
+
+#include <arts/kplayobject.h>
+#include <arts/kartsserver.h>
+#include <arts/kartsdispatcher.h>
+
+class Particle;
+class Writer;
+
+class KFireSaver : public QGLWidget
+{
+ public:
+ KFireSaver( QWidget *parent=0, const char *name=0 );
+ ~KFireSaver();
+
+ protected:
+ void initializeGL();
+ void resizeGL( int, int );
+ void paintGL();
+ void timerEvent( class QTimerEvent * );
+
+ private:
+ enum enumFireworkType
+ {
+ Sphere = 0,
+ NoFW = 1,
+ Circle = 2,
+ BiCircle = 3,
+ AngelHairs = 4,
+ Splitter = 5,
+ Spirals = 6,
+ SuperNova = 7,
+ NoRender = 8
+ };
+
+ inline enumFireworkType pickType();
+ inline int pickColour();
+ void explodeFirework(Particle* fireWorkLeaderParticle);
+ void burnLogo(QImage * image);
+ void playSound(QString file);
+ bool loadTexture(QString file, unsigned int & textureID);
+ void freeTexture(unsigned int & textureID);
+ void readConfig();
+
+ //list of particles and stars
+ QPtrList<Particle>
+ particleList,
+ starList;
+
+ //stuff for 'exploding' pixmaps (kde, tux, icons..)
+ QPtrList<QImage>
+ imageList;
+
+ //texture stuff
+ unsigned int
+ currentTexture,
+ particleTexture,
+ starTexture,
+ flareTexture,
+ diastarTexture; // (to add) novaTexture cometTexture
+
+ //sound stuff
+ KArtsDispatcher artsDispatcher;
+ KArtsServer artsServer;
+ QPtrList<KPlayObject> playObjectList;
+ QString sound_explosion,
+ sound_debris;
+
+ //other stuff
+ class Writer * writer;
+ float unitX,
+ unitY;
+ double timeStampFrame;
+ bool firstGLFrame;
+
+ struct {
+ bool enableBottomFire, //show
+ enableSound,
+ enableNoOverhead,
+ enableRealtime,
+ enableCombos, //fireworks
+ enableLogos, //specials
+ enableReduceLogo,
+ enableStars,
+ enableStarFlickering,
+ enableStarGradient,
+ enableWritings,
+ enableSphereLight, //effects
+ enableFlash,
+ enableFade,
+ enableMegaFlares,
+ enableTrails;
+ int fireworksFrequency, //show
+ particleSize,
+ logoFrequency, //specials
+ starsNumber,
+ flashOpacity, //effects
+ fadeAmount,
+ megaFlares;
+ QColor
+ bottomFireColor;
+ int colorsCount,
+ colorsT[8],
+ typesCount;
+ enumFireworkType
+ typesT[9];
+ } parameters;
+
+
+ enum enumShowType {
+ Show = 0,
+ Random = 1,
+ Monotype = 2,
+ Monochrome = 3
+ };
+
+ struct {
+ enum enumShowType ShowType;
+ int colour,
+ colourSec;
+ enumFireworkType
+ type,
+ typeSec;
+ bool forceBicolour,
+ forceColour,
+ forcePower,
+ forceType;
+ float powerEnvelop;
+ double timeStamp,
+ timeGap;
+ } showp;
+};
+
+#endif
diff --git a/kscreensaver/kdesavers/firesaverparticle.cpp b/kscreensaver/kdesavers/firesaverparticle.cpp
new file mode 100644
index 00000000..421115a7
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaverparticle.cpp
@@ -0,0 +1,273 @@
+// This file is part of KFireSaver3D.
+
+// KFireSaver3D is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+
+// KFireSaver3D is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with KFireSaver3D; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver)
+// Email: asy@libero.it
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "firesaverparticle.h"
+#include "firesaver.h"
+
+//current color scheme : red orng grn blue w m c
+static const GLfloat c_red_min[7] = { 0.4, 0.9, 0, 0, 1, 0, 0 };
+static const GLfloat c_red_max[7] = { 1, 1, 0, 0, 1, 1, 0 };
+static const GLfloat c_green_min[7] = { 0, 0.4, 0.4, 0, 1, 0, 0 };
+static const GLfloat c_green_max[7] = { 0, 0.5, 1, 0.5, 1, 0, 1 };
+static const GLfloat c_blue_min[7] = { 0, 0.1, 0, 0.5, 1, 0, 0 };
+static const GLfloat c_blue_max[7] = { 0, 0.2, 0, 1, 1, 1, 1 };
+
+
+//default initialization (good for Leader / Fire)
+Particle :: Particle( ParticleType pT )
+ : particleType( pT ), explosionsDepth( 0 ), texture( 0 ),
+ xpos( 0.0 ), ypos( 0.0 ), zpos( -9.9 ),
+ xspeed( 0.0 ), yspeed( 0.0 ), zspeed( 0.0 ), zacc( -9.807 ),
+ life( 0.0 ), startLife( 0.0 ),
+ pixelSize( 5.0 ), useLife( true ), flicker( 0 )
+{
+ colour[0] = 0;
+ colour[1] = 0;
+ colour[2] = 0;
+ colour[3] = 1;
+}
+
+
+void Particle :: initializeValues (
+ int cs,
+ Particle* debrisParent,
+ GLfloat powermin, GLfloat powermax,
+ bool flickers,
+ GLfloat *displace )
+//note: this function is called when a particle needs a set of default parameters.
+// these depends on the ParticleType.
+{
+ switch (particleType)
+ {
+// -- FireParticle (params: [cs])
+// born in a rectangle centered in { 0, 0, -9.9 }
+// speed 3-6 [m/s] blue/cyan colored
+// this is only done at the beginning or when a particle dies
+ case FireParticle:
+ xpos = DRAND * FIELDWIDTH - FIELDW_2;
+ ypos = DRAND - 2.0;
+
+ xspeed = DRAND * 4.0 - 2.0;
+ yspeed = DRAND * 2.0;
+ zspeed = DRAND * 3.0 + 3.0;
+
+ useLife = false;
+ pixelSize = 2.0 + DRAND * 2.0;
+ break;
+
+// -- FireWorkLeaderParticle (params: none)
+// they start in a rectangle at the same height but
+// with different power and the same 'orange' colour
+ case FireWorkLeaderParticle:
+ xpos = DRAND * 14.0 - 7.0;
+ ypos = DRAND * 2.0 - 1.0;
+
+ xspeed = DRAND * 8.0 - 4.0 - (xpos / 2.0)*DRAND;
+ yspeed = DRAND * 8.0 - 4.0;
+ zspeed = DRAND * 6.5 + 18.0;
+
+ colour[0] = 0.6;
+ colour[1] = DRAND * 0.4;
+ colour[2] = 0.0;
+
+ useLife = false;
+ break;
+
+// -- LogoParticle (params: none)
+// they start in the middle of the screen.
+// little g-force, constant life, weavy-y
+ case LogoParticle:
+ yspeed = 3*(DRAND - DRAND);
+ zacc = -9.807f / 5.0f;
+
+ startLife = 0.7f;
+ life = 1.7f;
+ break;
+
+// -- StarParticle (params: none)
+// spherically distributed. xpos and ypos are the
+// transformed screen positions of the star.
+ case StarParticle:
+ colour[0] = DRAND * 0.2 + 0.5;
+ colour[1] = DRAND * 0.2 + 0.5;
+ colour[2] = DRAND * 0.2 + 0.5;
+
+ {bool accepted = false;
+ while (!accepted) {
+ float module = 30,
+ theta = DRAND * M_PI * 2.0,
+ u = DRAND * 2.0 - 1.0,
+ root = sqrt( 1 - u*u );
+ xpos = module * root * cos(theta);
+ ypos = fabs(module * root * sin(theta)) - 10.0;
+ zpos = fabs(module * u);
+
+ float sfactor = 256.0 / (256.0 + PERSP_MAG_FACTOR*ypos);
+ xpos *= sfactor;
+ ypos = sfactor * zpos - FIELDW_2;
+
+ pixelSize = sfactor * (2.0 + 3.0*DRAND);
+
+ accepted = xpos > -FIELDW_2 && xpos < FIELDW_2 &&
+ ypos > -FIELDW_2 && ypos < FIELDW_2;
+ }}
+ break;
+
+// -- FireWorkDebrisParticle (params: cs, parent, [powerm], [powerM], [flickers], [displace])
+// parameters are randomized for a 'spherical' explosion.
+// power{min,max}, flickers and displace applies only for that
+// kind of ParticleType.
+ case FireWorkDebrisParticle:
+
+ //same origin of the dead leader
+ xpos = debrisParent->xpos;
+ ypos = debrisParent->ypos;
+ zpos = debrisParent->zpos;
+
+ //true spherical randomization
+ float module = powermin + DRAND * (powermax - powermin),
+ theta = DRAND * M_PI * 2.0,
+ u = DRAND * 2.0 - 1.0,
+ root = sqrt( 1 - u*u );
+ xspeed = debrisParent->xspeed + module * root * cos(theta) * (1.0 + DRAND/3.0);
+ yspeed = debrisParent->yspeed + module * root * sin(theta) * (1.0 + DRAND/3.0);
+ zspeed = module * u * (1.0 + DRAND/3.0); //was 0.9 + DRAND/3
+
+ //if set add a displace to speed
+ if ( displace ) {
+ xspeed += displace[0];
+ yspeed += displace[1];
+ zspeed += displace[2];
+ }
+
+ //randomize the color choosing on current palette
+ colour[0] = c_red_min[cs] + (c_red_max[cs]-c_red_min[cs]) * DRAND;
+ colour[1] = c_green_min[cs] + (c_green_max[cs]-c_green_min[cs]) * DRAND;
+ colour[2] = c_blue_min[cs] + (c_blue_max[cs]-c_blue_min[cs]) * DRAND;
+
+ pixelSize = DRAND * 2.0 + 2.0;
+ zacc = -9.807 / (6.0 - pixelSize);
+
+ life = startLife = pixelSize / 2.0;
+
+ //if flickers is set the current visible delay is randomized
+ if ( flickers )
+ flicker = (int) ((DRAND * 2.0 - 1.0) * (float)FLICKER_FRAMES_DELAY);
+ break;
+ }
+}
+
+
+void Particle :: updateParameters( float dT )
+//note: this procedure uses a reduced set of parameters
+// x and y axis acceleration is no more used
+// the only external iterations are:
+// - the g force
+// - a sort of air friction that limits speed in x,y and
+// acceleration on z
+{
+ xpos += xspeed * dT;
+ ypos += yspeed * dT;
+ zpos += (zspeed + zacc*dT/2) * dT;
+
+ zspeed += zacc * dT;
+
+ xspeed *= 0.998;
+ yspeed *= 0.998;
+ zspeed *= 0.999;
+
+ if (useLife)
+ life -= dT;
+}
+
+
+// BEGIN TurningParticle class
+
+TurningParticle :: TurningParticle( ParticleType pT )
+ : Particle( pT ) {}
+
+void TurningParticle :: initializeValues (
+ int cs,
+ Particle* leader,
+ GLfloat powermin,
+ GLfloat powermax,
+ bool /*flickers*/,
+ GLfloat * /*displace*/ )
+{
+ //same origin of the parent
+ xpos = leader->xpos;
+ ypos = leader->ypos;
+ zpos = leader->zpos;
+
+ //velocity : true spherical randomization
+ float module = powermin + (powermax - powermin) * DRAND * 0.6,
+ theta = DRAND * M_PI * 2.0,
+ u = DRAND * 2.0 - 1.0,
+ root = sqrt( 1 - u*u );
+ xspeed = -module * root * cos(theta);
+ yspeed = -module * root * sin(theta);
+ zspeed = module * u;
+
+ //spin axis : in quadrature with velocity
+ module = (1 + DRAND) / 40;
+ u = DRAND * 2.0 - 1.0;
+ root = sqrt( 1 - u*u );
+ // axis to spin around
+ wx = module * root * cos(theta + M_PI_2);
+ wy = module * root * sin(theta + M_PI_2);
+ wz = module * u;
+
+ //randomize the color choosing on current palette
+ colour[0] = c_red_min[cs] + (c_red_max[cs]-c_red_min[cs]) * DRAND;
+ colour[1] = c_green_min[cs] + (c_green_max[cs]-c_green_min[cs]) * DRAND;
+ colour[2] = c_blue_min[cs] + (c_blue_max[cs]-c_blue_min[cs]) * DRAND;
+
+ pixelSize = DRAND * 2.0 + 2.0;
+ zacc = -9.807 / 5.0;
+ life = startLife = pixelSize / 2.0;
+}
+
+
+void TurningParticle :: updateParameters ( float dT )
+{
+ //update position
+ xpos += xspeed * dT;
+ ypos += yspeed * dT;
+ zpos += zspeed * dT;
+
+ //tan vector = velocity vector (vect producted by) spin axis
+ float vx = yspeed * wz - zspeed * wy,
+ vy = zspeed * wx - xspeed * wz,
+ vz = xspeed * wy - yspeed * wx;
+
+ //update velocity adding a tangential component (aka infinitesimally
+ //rotating the vector)
+ xspeed += vx;
+ yspeed += vy;
+ zspeed += vz + zacc * dT;
+
+ if (useLife)
+ life -= dT;
+}
+
+//END TurningParticle
diff --git a/kscreensaver/kdesavers/firesaverparticle.h b/kscreensaver/kdesavers/firesaverparticle.h
new file mode 100644
index 00000000..de8d9ac2
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaverparticle.h
@@ -0,0 +1,105 @@
+// This file is part of KFireSaver3D.
+
+// KFireSaver3D is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+
+// KFireSaver3D is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with KFireSaver3D; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver)
+// Email: asy@libero.it
+
+#ifndef KFIRESAVER_PARTICLE_H
+#define KFIRESAVER_PARTICLE_H
+
+#include <qgl.h>
+
+#define FLICKER_FRAMES_DELAY 8
+#define DRAND ((float)rand() / (float)RAND_MAX) /*random float between 0 and 1*/
+
+/* -- Particle class.
+ * Sets initial parameters and takes care of updating physics for a single
+ * fireworks particle. The physics model is the Newtonian one.
+ */
+class Particle
+{
+ public:
+ //enum definitions for type of particle
+ enum ParticleType
+ {
+ FireParticle,
+ FireWorkLeaderParticle,
+ FireWorkDebrisParticle,
+ LogoParticle,
+ StarParticle
+ };
+
+ Particle( ParticleType pT );
+
+ //public methods for initializing default parameters and update them
+ virtual void initializeValues (
+ int color_scheme = 0,
+ Particle* leader = 0L,
+ GLfloat powermin = 5.0,
+ GLfloat powermax = 10.0,
+ bool flickers = false,
+ GLfloat *displace = 0L );
+
+ virtual void updateParameters ( float timeGap );
+
+ //public accessible variables of the class
+ ParticleType particleType;
+ int explosionsDepth;
+ unsigned int texture;
+
+ GLfloat xpos, ypos, zpos,
+ xspeed, yspeed, zspeed,
+ zacc;
+
+ GLfloat colour[4],
+ life, startLife,
+ pixelSize;
+
+ bool useLife;
+ int flicker;
+
+ private:
+ Particle();
+};
+
+
+/* -- TurningParticle class.
+ * Randomize initial parameters similar to a standard 'spherical' particle
+ * and takes care of updating physics. The physics model is a funny 'bees'
+ * (vectorial-product) one.
+ */
+class TurningParticle : public Particle
+{
+ public:
+ TurningParticle( ParticleType pT );
+
+ virtual void initializeValues (
+ int color_scheme = 0,
+ Particle* leader = 0L,
+ GLfloat powermin = 5.0,
+ GLfloat powermax = 10.0,
+ bool flickers = false,
+ GLfloat *displace = 0L );
+
+ virtual void updateParameters ( float dT );
+
+ private:
+ float wx, wy, wz;
+ TurningParticle();
+};
+
+#endif
diff --git a/kscreensaver/kdesavers/firesaversetup.ui b/kscreensaver/kdesavers/firesaversetup.ui
new file mode 100644
index 00000000..37614afa
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaversetup.ui
@@ -0,0 +1,1855 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KFireSaverSetup</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KFireSaverSetup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>375</width>
+ <height>344</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>KFireSaver Setup</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>useButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Load</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>KDE (default)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Elegant White</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Quick Simple</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Enhanced Reality</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Hypnotic Illusions</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>presetCombo</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>presetLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Preset:</string>
+ </property>
+ </widget>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>201</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QTabWidget" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <property name="tabShape">
+ <enum>Rounded</enum>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Preview</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer162</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>220</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer161</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>210</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout118</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer162_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>43</width>
+ <height>180</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QFrame" row="1" column="1">
+ <property name="name">
+ <cstring>previewFrame</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>240</width>
+ <height>180</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>240</width>
+ <height>180</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>preview window</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here is the preview (if it is not detached)</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>previewLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>P R E V I E W</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer161_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>180</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>detachBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show in separate window</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>applyButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply &amp;&amp; Update</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Show</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layS1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>showLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Show type:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Simple Show</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Completely Random</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Only Change Color</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Only Change Fireworks</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>showCombo</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer25</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>260</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layS2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>showLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Number of fireworks:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>showLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>few</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>fireworksSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>4</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>showLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>more</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>125</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layS2_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>particlesLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Size of particles:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>particlesLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>small</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>particlesSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>-5</number>
+ </property>
+ <property name="maxValue">
+ <number>5</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>particlesLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>big</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>125</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>bottomfireBox</cstring>
+ </property>
+ <property name="text">
+ <string>Use bottom fire</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layS3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>bottomfireLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>bottomfireColorButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Select the color</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>309</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>soundsBox</cstring>
+ </property>
+ <property name="text">
+ <string>Enable sounds</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>overheadBox</cstring>
+ </property>
+ <property name="text">
+ <string>Limit overload (recommended)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>frameskipBox</cstring>
+ </property>
+ <property name="text">
+ <string>Realtime fps adjust (recommended)</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacerT2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Fireworks</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacerT3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layF2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>whiteBox</cstring>
+ </property>
+ <property name="text">
+ <string>Blinding white</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="1">
+ <property name="name">
+ <cstring>purpleBox</cstring>
+ </property>
+ <property name="text">
+ <string>Velvet purple</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="1">
+ <property name="name">
+ <cstring>seagreenBox</cstring>
+ </property>
+ <property name="text">
+ <string>Deep-sea green</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="2">
+ <property name="name">
+ <cstring>redBox</cstring>
+ </property>
+ <property name="text">
+ <string>Deep red</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="2">
+ <property name="name">
+ <cstring>combosBox</cstring>
+ </property>
+ <property name="text">
+ <string>Multicolor</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try bi-color fireworks</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This allow a random creation of fireworks that explodes in 2 colors</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>blueBox</cstring>
+ </property>
+ <property name="text">
+ <string>Boring blue</string>
+ </property>
+ </widget>
+ <spacer row="0" column="0" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>spacer7_2_5_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="0" column="2">
+ <property name="name">
+ <cstring>orangeBox</cstring>
+ </property>
+ <property name="text">
+ <string>Hot orange</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="2">
+ <property name="name">
+ <cstring>greenBox</cstring>
+ </property>
+ <property name="text">
+ <string>Purest green</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>colorsLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Colors</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>fireworksLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Fireworks</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layF1</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="2" column="1">
+ <property name="name">
+ <cstring>fire3Box</cstring>
+ </property>
+ <property name="text">
+ <string>Flames ring</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="2">
+ <property name="name">
+ <cstring>fire6Box</cstring>
+ </property>
+ <property name="text">
+ <string>Atomic splitter</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="2">
+ <property name="name">
+ <cstring>fire5Box</cstring>
+ </property>
+ <property name="text">
+ <string>Sparkling fall</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>fire1Box</cstring>
+ </property>
+ <property name="text">
+ <string>Classic</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>fire2Box</cstring>
+ </property>
+ <property name="text">
+ <string>Only explosion</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ <spacer row="0" column="0" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>spacer7_2_5_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="3" column="2">
+ <property name="name">
+ <cstring>fire8Box</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>SuperNova</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="2">
+ <property name="name">
+ <cstring>fire7Box</cstring>
+ </property>
+ <property name="text">
+ <string>Toxic spirals</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="1">
+ <property name="name">
+ <cstring>fire4Box</cstring>
+ </property>
+ <property name="text">
+ <string>Flames world</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>try me</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Specials</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="5" column="0">
+ <property name="name">
+ <cstring>spacerT4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>logosBox</cstring>
+ </property>
+ <property name="text">
+ <string>Logos</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Watch exploding images</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enable images explosion.</string>
+ </property>
+ </widget>
+ <widget class="QFrame" row="1" column="0">
+ <property name="name">
+ <cstring>logosFrame</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer46</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>70</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layP1</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>logosIconsBox</cstring>
+ </property>
+ <property name="text">
+ <string>KDE icons</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enables KDE Icons</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enables random KDE Icons explosions.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>logosTuxBox</cstring>
+ </property>
+ <property name="text">
+ <string>Tux</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enables Tux</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enables random Tux explosions.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>logosDetailBox</cstring>
+ </property>
+ <property name="text">
+ <string>Reduce detail</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>useful for increasing speed</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When enabled speeds up logo explosion but reduces quality.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>logosKonquiBox</cstring>
+ </property>
+ <property name="text">
+ <string>Konqui</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enables Konqui</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enables random Konqui explosions.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layP2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>frequencyLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Frequency:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>neverLabel</cstring>
+ </property>
+ <property name="text">
+ <string>sometimes</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>logosSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>oftenLabel</cstring>
+ </property>
+ <property name="text">
+ <string>often</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer18</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>91</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QFrame" row="3" column="0">
+ <property name="name">
+ <cstring>starsFrame</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer7_2_5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>50</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layP3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>starsFlickerBox</cstring>
+ </property>
+ <property name="text">
+ <string>Flickering</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>enables a natural 'flicker' effect</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This option produces a sort of vibration in the lightness of the star.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>starsGradientBox</cstring>
+ </property>
+ <property name="text">
+ <string>Red-blue gradient</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>emulate horizon coloring</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Gives lower stars a reddish tint.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layP4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_5</cstring>
+ </property>
+ <property name="text">
+ <string>Number:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2_6</cstring>
+ </property>
+ <property name="text">
+ <string>less</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>starsSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2_2_5</cstring>
+ </property>
+ <property name="text">
+ <string>more</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6_5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>149</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>starsBox</cstring>
+ </property>
+ <property name="text">
+ <string>Stars</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Watch the stars</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enable stars in the sky.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0">
+ <property name="name">
+ <cstring>writingsBox</cstring>
+ </property>
+ <property name="text">
+ <string>Writings</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Watch the stars</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enable stars in the sky.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Effects</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>flashBox</cstring>
+ </property>
+ <property name="text">
+ <string>Flash screen on explosions</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="4" column="0">
+ <property name="name">
+ <cstring>layE2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7_2_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>fadeLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Intensity:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>fadeLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>small</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>fadeSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>9</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>3</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>fadeLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>hypnotic</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>131</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="5" column="0">
+ <property name="name">
+ <cstring>flaresBox</cstring>
+ </property>
+ <property name="text">
+ <string>Mega flares</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="6" column="0">
+ <property name="name">
+ <cstring>layE3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7_2_4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>flaresLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Dimension:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>flaresLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>small</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>flaresSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>flaresLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>big</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6_4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>117</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="7" column="0">
+ <property name="name">
+ <cstring>trailBox</cstring>
+ </property>
+ <property name="text">
+ <string>Fireworks leave a particle trail</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>not yet ported</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>not yet ported</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layE1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>flashLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Flash opacity:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>flashLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>min</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>flashSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>flashLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>max</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>110</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>fadeBox</cstring>
+ </property>
+ <property name="text">
+ <string>Fade effect</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>lightBox</cstring>
+ </property>
+ <property name="text">
+ <string>Spherical light after explosion</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>warning, this can shock your mind :-)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Multiplies the scale factor for particles near you, resulting in a colorful experience.</string>
+ </property>
+ </widget>
+ <spacer row="8" column="0">
+ <property name="name">
+ <cstring>spacerT5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>logosBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>logosFrame</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>starsBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>starsFrame</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bottomfireBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bottomfireLabel1</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bottomfireBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bottomfireColorButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flashBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flashLabel1</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flashBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flashLabel2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flashBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flashLabel3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flashBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flashSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>fadeBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>fadeLabel1</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>fadeBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>fadeLabel2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>fadeBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>fadeLabel3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>fadeBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>fadeSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flaresBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flaresLabel1</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flaresBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flaresLabel2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flaresBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flaresLabel3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flaresBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flaresSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>useButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KFireSaverSetup</receiver>
+ <slot>useButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>applyButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KFireSaverSetup</receiver>
+ <slot>applyButton_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>detachBox</sender>
+ <signal>clicked()</signal>
+ <receiver>KFireSaverSetup</receiver>
+ <slot>updatePreview()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>presetCombo</tabstop>
+ <tabstop>useButton</tabstop>
+ <tabstop>tabWidget</tabstop>
+ <tabstop>showCombo</tabstop>
+ <tabstop>fireworksSlider</tabstop>
+ <tabstop>particlesSlider</tabstop>
+ <tabstop>bottomfireBox</tabstop>
+ <tabstop>bottomfireColorButton</tabstop>
+ <tabstop>soundsBox</tabstop>
+ <tabstop>overheadBox</tabstop>
+ <tabstop>frameskipBox</tabstop>
+ <tabstop>fire1Box</tabstop>
+ <tabstop>fire2Box</tabstop>
+ <tabstop>fire3Box</tabstop>
+ <tabstop>fire4Box</tabstop>
+ <tabstop>fire5Box</tabstop>
+ <tabstop>fire6Box</tabstop>
+ <tabstop>fire7Box</tabstop>
+ <tabstop>fire8Box</tabstop>
+ <tabstop>whiteBox</tabstop>
+ <tabstop>blueBox</tabstop>
+ <tabstop>seagreenBox</tabstop>
+ <tabstop>purpleBox</tabstop>
+ <tabstop>orangeBox</tabstop>
+ <tabstop>redBox</tabstop>
+ <tabstop>greenBox</tabstop>
+ <tabstop>combosBox</tabstop>
+ <tabstop>logosBox</tabstop>
+ <tabstop>logosKonquiBox</tabstop>
+ <tabstop>logosTuxBox</tabstop>
+ <tabstop>logosIconsBox</tabstop>
+ <tabstop>logosDetailBox</tabstop>
+ <tabstop>logosSlider</tabstop>
+ <tabstop>starsBox</tabstop>
+ <tabstop>starsFlickerBox</tabstop>
+ <tabstop>starsGradientBox</tabstop>
+ <tabstop>starsSlider</tabstop>
+ <tabstop>lightBox</tabstop>
+ <tabstop>flashBox</tabstop>
+ <tabstop>flashSlider</tabstop>
+ <tabstop>fadeBox</tabstop>
+ <tabstop>fadeSlider</tabstop>
+ <tabstop>flaresBox</tabstop>
+ <tabstop>flaresSlider</tabstop>
+ <tabstop>trailBox</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">firesaver.h</include>
+ <include location="local" impldecl="in implementation">firesaversetup.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">KFireSaver * fireSaverWidget;</variable>
+</variables>
+<slots>
+ <slot>applyButton_clicked()</slot>
+ <slot>updatePreview()</slot>
+ <slot>writeConfig()</slot>
+ <slot>readConfig()</slot>
+ <slot>useButton_clicked()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private">destroy()</function>
+</functions>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kscreensaver/kdesavers/firesaversetup.ui.h b/kscreensaver/kdesavers/firesaversetup.ui.h
new file mode 100644
index 00000000..8cf478e2
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaversetup.ui.h
@@ -0,0 +1,400 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+
+#ifndef KFIRESAVER_SETUP_H
+#define KFIRESAVER_SETUP_H
+
+#include <qcolor.h>
+#include <qtimer.h>
+#include <kconfig.h>
+
+
+void KFireSaverSetup::init()
+{
+ readConfig();
+ fireSaverWidget = NULL;
+ updatePreview();
+}
+
+void KFireSaverSetup::destroy()
+{
+ if ( fireSaverWidget )
+ delete fireSaverWidget;
+}
+
+
+void KFireSaverSetup::applyButton_clicked()
+{
+ writeConfig();
+ updatePreview();
+}
+
+void KFireSaverSetup::updatePreview()
+{
+ if ( fireSaverWidget )
+ delete fireSaverWidget;
+ if ( detachBox->isChecked() ) {
+ previewLabel->show();
+ fireSaverWidget = new KFireSaver;
+ fireSaverWidget->resize(640,480);
+ } else {
+ previewLabel->hide();
+ fireSaverWidget = new KFireSaver( previewFrame );
+ fireSaverWidget->move(1,1);
+ fireSaverWidget->resize(
+ previewFrame->width() - 2,
+ previewFrame->height() - 2 );
+ }
+ fireSaverWidget->show();
+}
+
+
+void KFireSaverSetup::writeConfig()
+{
+ KConfig config("kfiresaverrc",false,false);
+
+ // show
+ config.setGroup( "Show" );
+ config.writeEntry( "ShowType", showCombo->currentItem() );
+ config.writeEntry( "FireworksFrequency", fireworksSlider->value() );
+ config.writeEntry( "ParticlesSize", particlesSlider->value() );
+ config.writeEntry( "enable-BottomFire", bottomfireBox->isChecked() );
+ config.writeEntry( "BottomFireColor", bottomfireColorButton->color() );
+ config.writeEntry( "enable-Sounds", soundsBox->isChecked() );
+ config.writeEntry( "enable-NoOverhead", overheadBox->isChecked() );
+ config.writeEntry( "enable-FrameSkip", frameskipBox->isChecked() );
+
+ // fireworks
+ config.setGroup( "Fireworks" );
+ if (!fire1Box->isChecked() && !fire2Box->isChecked() &&
+ !fire3Box->isChecked() && !fire4Box->isChecked() &&
+ !fire5Box->isChecked() && !fire6Box->isChecked() &&
+ !fire7Box->isChecked() && !fire8Box->isChecked())
+ fire1Box->setChecked(true);
+ config.writeEntry( "use-Classic", fire1Box->isChecked() );
+ config.writeEntry( "use-Explosion", fire2Box->isChecked() );
+ config.writeEntry( "use-FlameRing", fire3Box->isChecked() );
+ config.writeEntry( "use-FlameWorld", fire4Box->isChecked() );
+ config.writeEntry( "use-Fall", fire5Box->isChecked() );
+ config.writeEntry( "use-Splitter", fire6Box->isChecked() );
+ config.writeEntry( "use-Spirals", fire7Box->isChecked() );
+ config.writeEntry( "use-SuperNova", fire8Box->isChecked() );
+ if (!redBox->isChecked() && !orangeBox->isChecked() &&
+ !greenBox->isChecked() && !blueBox->isChecked() &&
+ !whiteBox->isChecked() && !purpleBox->isChecked() &&
+ !seagreenBox->isChecked())
+ whiteBox->setChecked(true);
+ config.writeEntry( "use-White", whiteBox->isChecked() );
+ config.writeEntry( "use-Blue", blueBox->isChecked() );
+ config.writeEntry( "use-DeepGreen", seagreenBox->isChecked() );
+ config.writeEntry( "use-Purple", purpleBox->isChecked() );
+ config.writeEntry( "use-Orange", orangeBox->isChecked() );
+ config.writeEntry( "use-Red", redBox->isChecked() );
+ config.writeEntry( "use-Green", greenBox->isChecked() );
+ config.writeEntry( "use-Multicolor", combosBox->isChecked() );
+
+ // specials
+ config.setGroup( "Specials" );
+ config.writeEntry( "enable-Logos", logosBox->isChecked() );
+ config.writeEntry( "LogosKonqui", logosKonquiBox->isChecked() );
+ config.writeEntry( "LogosTux", logosTuxBox->isChecked() );
+ config.writeEntry( "LogosKDEIcons", logosIconsBox->isChecked() );
+ config.writeEntry( "LogosReduceDetail", logosDetailBox->isChecked() );
+ config.writeEntry( "LogosFrequency", logosSlider->value() );
+ config.writeEntry( "enable-Stars", starsBox->isChecked() );
+ config.writeEntry( "StarsFlicker", starsFlickerBox->isChecked() );
+ config.writeEntry( "StarsGradient", starsGradientBox->isChecked() );
+ config.writeEntry( "StarsNumber", starsSlider->value() );
+ config.writeEntry( "enable-Writings", writingsBox->isChecked() );
+
+ // effects
+ config.setGroup( "Effects" );
+ config.writeEntry( "enable-SphericalLight", lightBox->isChecked() );
+ config.writeEntry( "enable-Flash", flashBox->isChecked() );
+ config.writeEntry( "FlashOpacity", flashSlider->value() );
+ config.writeEntry( "enable-Fade", fadeBox->isChecked() );
+ config.writeEntry( "FadeIntensity", fadeSlider->value() );
+ config.writeEntry( "enable-Flares", flaresBox->isChecked() );
+ config.writeEntry( "FlaresDimension", flaresSlider->value() );
+ config.writeEntry( "enable-Trail", trailBox->isChecked() );
+}
+
+
+void KFireSaverSetup::readConfig()
+{
+ KConfig config("kfiresaverrc",true,false);
+
+ // show
+ config.setGroup( "Show" );
+ showCombo->setCurrentItem(config.readNumEntry( "ShowType", 1 ));
+ fireworksSlider->setValue(config.readNumEntry( "FireworksFrequency", 7 ));
+ particlesSlider->setValue(config.readNumEntry( "ParticlesSize", 0 ));
+ bottomfireBox->setChecked(config.readBoolEntry( "enable-BottomFire", true ));
+ QColor blue = Qt::darkBlue;
+ bottomfireColorButton->setColor(config.readColorEntry( "BottomFireColor", &blue ));
+ soundsBox->setChecked(config.readBoolEntry( "enable-Sounds", false ));
+ overheadBox->setChecked(config.readBoolEntry( "enable-NoOverhead", true ));
+ frameskipBox->setChecked(config.readBoolEntry( "enable-FrameSkip", true ));
+
+ // fireworks
+ config.setGroup( "Fireworks" );
+ fire1Box->setChecked(config.readBoolEntry( "use-Classic", true ));
+ fire2Box->setChecked(config.readBoolEntry( "use-Explosion", false ));
+ fire3Box->setChecked(config.readBoolEntry( "use-FlameRing", false ));
+ fire4Box->setChecked(config.readBoolEntry( "use-FlameWorld", false ));
+ fire5Box->setChecked(config.readBoolEntry( "use-Fall", false ));
+ fire6Box->setChecked(config.readBoolEntry( "use-Splitter", false ));
+ fire7Box->setChecked(config.readBoolEntry( "use-Spirals", false ));
+ fire8Box->setChecked(config.readBoolEntry( "use-SuperNova", false ));
+ whiteBox->setChecked(config.readBoolEntry( "use-White", true ));
+ blueBox->setChecked(config.readBoolEntry( "use-Blue", false ));
+ seagreenBox->setChecked(config.readBoolEntry( "use-DeepGreen", true ));
+ purpleBox->setChecked(config.readBoolEntry( "use-Purple", false ));
+ orangeBox->setChecked(config.readBoolEntry( "use-Orange", true ));
+ redBox->setChecked(config.readBoolEntry( "use-Red", false ));
+ greenBox->setChecked(config.readBoolEntry( "use-Green", false ));
+ combosBox->setChecked(config.readBoolEntry( "use-Multicolor", true ));
+
+ // specials
+ config.setGroup( "Specials" );
+ logosBox->setChecked(config.readBoolEntry( "enable-Logos", true ));
+ logosKonquiBox->setChecked(config.readBoolEntry( "LogosKonqui", true ));
+ logosTuxBox->setChecked(config.readBoolEntry( "LogosTux", true ));
+ logosIconsBox->setChecked(config.readBoolEntry( "LogosKDEIcons", true ));
+ logosDetailBox->setChecked(config.readBoolEntry( "LogosReduceDetail", true ));
+ logosSlider->setValue(config.readNumEntry( "LogosFrequency", 4 ));
+ starsBox->setChecked(config.readBoolEntry( "enable-Stars", true ));
+ starsFlickerBox->setChecked(config.readBoolEntry( "StarsFlicker", false ));
+ starsGradientBox->setChecked(config.readBoolEntry( "StarsGradient", true ));
+ starsSlider->setValue(config.readNumEntry( "StarsNumber", 4 ));
+ writingsBox->setChecked(config.readBoolEntry( "enable-Writings", true ));
+
+ // effects
+ config.setGroup( "Effects" );
+ lightBox->setChecked(config.readBoolEntry( "enable-SphericalLight", true ));
+ flashBox->setChecked(config.readBoolEntry( "enable-Flash", false ));
+ flashSlider->setValue(config.readNumEntry( "FlashOpacity", 5 ));
+ fadeBox->setChecked(config.readBoolEntry( "enable-Fade", false ));
+ fadeSlider->setValue(config.readNumEntry( "FadeIntensity", 3 ));
+ flaresBox->setChecked(config.readBoolEntry( "enable-Flares", true ));
+ flaresSlider->setValue(config.readNumEntry( "FlaresDimension", 5 ));
+ trailBox->setChecked(config.readBoolEntry( "enable-Trail", false ));
+}
+
+void KFireSaverSetup::useButton_clicked()
+{
+ int ci = presetCombo->currentItem();
+
+ showCombo->setCurrentItem( 0 );
+ particlesSlider->setValue( 0 );
+ overheadBox->setChecked( true );
+ flashBox->setChecked( false );
+ //flashSlider->setValue( );
+ //soundsBox->setChecked( );
+ //logosDetailBox->setChecked( );
+
+ switch (ci){
+ case 0: // KDE default
+ showCombo->setCurrentItem( 1 );
+ fireworksSlider->setValue( 7 );
+ bottomfireBox->setChecked( true );
+ bottomfireColorButton->setColor( Qt::darkBlue );
+ frameskipBox->setChecked( true );
+ fire1Box->setChecked( true );
+ fire2Box->setChecked( false );
+ fire3Box->setChecked( false );
+ fire4Box->setChecked( false );
+ fire5Box->setChecked( false );
+ fire6Box->setChecked( false );
+ fire7Box->setChecked( false );
+ fire8Box->setChecked( false );
+ whiteBox->setChecked( true );
+ blueBox->setChecked( false );
+ seagreenBox->setChecked( true );
+ purpleBox->setChecked( false );
+ orangeBox->setChecked( true );
+ redBox->setChecked( false );
+ greenBox->setChecked( false );
+ combosBox->setChecked( true );
+ logosBox->setChecked( true );
+ logosKonquiBox->setChecked( true );
+ logosTuxBox->setChecked( true );
+ logosIconsBox->setChecked( true );
+ logosSlider->setValue( 4 );
+ starsBox->setChecked( true );
+ starsFlickerBox->setChecked( false );
+ starsGradientBox->setChecked( true );
+ starsSlider->setValue( 4 );
+ writingsBox->setChecked( true );
+ lightBox->setChecked( true );
+ fadeBox->setChecked( false );
+ //fadeSlider->setValue( );
+ flaresBox->setChecked( true );
+ flaresSlider->setValue( 5 );
+ trailBox->setChecked( false );
+ break;
+ case 1: // Elegant white
+ fireworksSlider->setValue( 7 );
+ bottomfireBox->setChecked( true );
+ bottomfireColorButton->setColor( Qt::blue );
+ frameskipBox->setChecked( true );
+ fire1Box->setChecked( true );
+ fire2Box->setChecked( false );
+ fire3Box->setChecked( false );
+ fire4Box->setChecked( false );
+ fire5Box->setChecked( true );
+ fire6Box->setChecked( true );
+ fire7Box->setChecked( false );
+ fire8Box->setChecked( false );
+ whiteBox->setChecked( true );
+ blueBox->setChecked( true );
+ seagreenBox->setChecked( false );
+ purpleBox->setChecked( false );
+ orangeBox->setChecked( false );
+ redBox->setChecked( false );
+ greenBox->setChecked( false );
+ combosBox->setChecked( true );
+ logosBox->setChecked( true );
+ logosKonquiBox->setChecked( true );
+ logosTuxBox->setChecked( false );
+ logosIconsBox->setChecked( false );
+ logosSlider->setValue( 3 );
+ starsBox->setChecked( true );
+ starsFlickerBox->setChecked( true );
+ starsGradientBox->setChecked( false );
+ starsSlider->setValue( 4 );
+ writingsBox->setChecked( true );
+ lightBox->setChecked( true );
+ fadeBox->setChecked( true );
+ fadeSlider->setValue( 3 );
+ flaresBox->setChecked( true );
+ flaresSlider->setValue( 6 );
+ trailBox->setChecked( true );
+ break;
+ case 2: // Quick simple
+ showCombo->setCurrentItem(1);
+ fireworksSlider->setValue( 4 );
+ bottomfireBox->setChecked( false );
+ //bottomfireColorButton->setColor( );
+ frameskipBox->setChecked( false );
+ fire1Box->setChecked( true );
+ fire2Box->setChecked( true );
+ fire3Box->setChecked( false );
+ fire4Box->setChecked( false );
+ fire5Box->setChecked( false );
+ fire6Box->setChecked( false );
+ fire7Box->setChecked( false );
+ fire8Box->setChecked( false );
+ whiteBox->setChecked( true );
+ blueBox->setChecked( true );
+ seagreenBox->setChecked( false );
+ purpleBox->setChecked( false );
+ orangeBox->setChecked( false );
+ redBox->setChecked( true );
+ greenBox->setChecked( true );
+ combosBox->setChecked( false );
+ logosBox->setChecked( true );
+ logosKonquiBox->setChecked( true );
+ logosTuxBox->setChecked( true );
+ logosIconsBox->setChecked( true );
+ logosSlider->setValue( 2 );
+ starsBox->setChecked( false );
+ //starsFlickerBox->setChecked( );
+ //starsGradientBox->setChecked( );
+ //starsSlider->setValue( );
+ writingsBox->setChecked( false );
+ lightBox->setChecked( false );
+ fadeBox->setChecked( false );
+ //fadeSlider->setValue( );
+ flaresBox->setChecked( false );
+ //flaresSlider->setValue( );
+ trailBox->setChecked( false );
+ break;
+ case 3: //Enhanced reality
+ fireworksSlider->setValue( 8 );
+ bottomfireBox->setChecked( true );
+ bottomfireColorButton->setColor( Qt::magenta );
+ frameskipBox->setChecked( true );
+ fire1Box->setChecked( true );
+ fire2Box->setChecked( true );
+ fire3Box->setChecked( true );
+ fire4Box->setChecked( true );
+ fire5Box->setChecked( true );
+ fire6Box->setChecked( true );
+ fire7Box->setChecked( false );
+ fire8Box->setChecked( false );
+ whiteBox->setChecked( true );
+ blueBox->setChecked( true );
+ seagreenBox->setChecked( true );
+ purpleBox->setChecked( true );
+ orangeBox->setChecked( true );
+ redBox->setChecked( true );
+ greenBox->setChecked( true );
+ combosBox->setChecked( true );
+ logosBox->setChecked( true );
+ logosKonquiBox->setChecked( false );
+ logosTuxBox->setChecked( true );
+ logosIconsBox->setChecked( false );
+ logosSlider->setValue( 2 );
+ starsBox->setChecked( true );
+ starsFlickerBox->setChecked( true );
+ starsGradientBox->setChecked( true );
+ starsSlider->setValue( 5 );
+ writingsBox->setChecked( true );
+ lightBox->setChecked( false );
+ fadeBox->setChecked( true );
+ fadeSlider->setValue( 3 );
+ flaresBox->setChecked( false );
+ //flaresSlider->setValue( );
+ trailBox->setChecked( true );
+ break;
+ case 4: //Hypnotic illusions
+ fireworksSlider->setValue( 9 );
+ bottomfireBox->setChecked( true );
+ bottomfireColorButton->setColor( Qt::red );
+ frameskipBox->setChecked( true );
+ fire1Box->setChecked( true );
+ fire2Box->setChecked( true );
+ fire3Box->setChecked( true );
+ fire4Box->setChecked( true );
+ fire5Box->setChecked( true );
+ fire6Box->setChecked( true );
+ fire7Box->setChecked( false );
+ fire8Box->setChecked( false );
+ whiteBox->setChecked( true );
+ blueBox->setChecked( true );
+ seagreenBox->setChecked( true );
+ purpleBox->setChecked( true );
+ orangeBox->setChecked( true );
+ redBox->setChecked( true );
+ greenBox->setChecked( true );
+ combosBox->setChecked( true );
+ logosBox->setChecked( false );
+ //logosKonquiBox->setChecked( true );
+ //logosTuxBox->setChecked( true );
+ //logosIconsBox->setChecked( true );
+ //logosSlider->setValue( 5 );
+ starsBox->setChecked( true );
+ starsFlickerBox->setChecked( true );
+ starsGradientBox->setChecked( true );
+ starsSlider->setValue( 8 );
+ writingsBox->setChecked( false );
+ lightBox->setChecked( false );
+ fadeBox->setChecked( true );
+ fadeSlider->setValue( 7 );
+ flaresBox->setChecked( true );
+ flaresSlider->setValue( 8 );
+ trailBox->setChecked( false );
+ break;
+ }
+ //applyButton_clicked();
+}
+
+#endif
diff --git a/kscreensaver/kdesavers/firesaverwriter.cpp b/kscreensaver/kdesavers/firesaverwriter.cpp
new file mode 100644
index 00000000..07209884
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaverwriter.cpp
@@ -0,0 +1,247 @@
+/***************************************************************************
+ * Copyright (C) 2004 by E.Ros *
+ * rosenric@dei.unipd.it *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <math.h>
+#include <stdlib.h>
+#include <qimage.h>
+#include <qgl.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <kdeversion.h>
+#include <klocale.h>
+#include "firesaverwriter.h"
+
+
+/* Word: SINGLE WORD */
+
+Word::Word( const char * _text, QMap<char, Symbol *> * sMap, float _scale )
+ : width(0), scale(_scale), cX(0), cY(0), vScale(0), vX(0), vY(0),
+ activateTime(0.0), lifeTime(2), currentTime(0)
+{
+ for ( ; *_text != 0 && *_text != ' '; _text++ )
+ {
+ char c = *_text;
+ if ( !sMap->contains(c) ) //search for a symbol in the map
+ continue;
+ Symbol * symbol = (*sMap)[c]; //get the symbol*
+ width += symbol->scale; //increase word's half-width
+ symbolList.append( symbol ); //insert it to the list
+ }
+ color[0] = 0;
+ color[1] = 0.8 * drand48();
+ color[2] = 0.2 + 0.8 * drand48();
+ color[3] = 1;
+}
+
+inline void Word::renderWord( double dT )
+{
+ if ( (currentTime += dT) < activateTime )
+ return;
+
+ //update coloring
+ if ( activateTime >= 0 ) {
+ if ( currentTime < activateTime + 0.4 )
+ color[3] = (currentTime - activateTime) / 0.4;
+ else
+ color[3] = 1 - (currentTime - activateTime - 0.4) / (lifeTime - 0.4);
+ } else
+ color[3] = 1 - currentTime / lifeTime;
+
+ //word's global transforms
+ glPushMatrix();
+ glTranslatef( cX - scale * width, cY, 0 );
+ glScalef( scale, scale, 1 );
+ glColor4fv( color );
+
+ //for each symbol draw it!
+ Symbol * symbol = symbolList.first();
+ for( ; symbol; symbol = symbolList.next() )
+ symbol->renderSymbol();
+ glPopMatrix();
+
+ //physical update to position and scale
+ cX += vX * dT;
+ cY += vY * dT;
+ scale += scale * vScale * dT;
+}
+
+inline bool Word::isDead()
+{
+ if ( activateTime > 0 )
+ return (currentTime - activateTime) >= lifeTime;
+ return currentTime >= lifeTime;
+}
+
+
+
+/* Writer: engine that spawns and manages words */
+
+Writer::Writer( QString descFileName )
+ : numTextures(0)
+{
+ wordList.setAutoDelete( true );
+
+ if ( !loadMap( descFileName ) )
+ return;
+
+ QString welcomeString = i18n("Welcome to KDE %1.%2.%3")
+ .arg(KDE_VERSION_MAJOR)
+ .arg(KDE_VERSION_MINOR)
+ .arg(KDE_VERSION_RELEASE);
+ spawnWords(welcomeString, Fun1);
+}
+
+Writer::~ Writer()
+{
+ glDeleteTextures( numTextures, texArray );
+ wordList.clear();
+ QMap<char, Symbol *>::Iterator it = symbolMap.begin();
+ for ( ; it != symbolMap.end(); ++it )
+ delete (Symbol *)it.data();
+}
+
+void Writer::spawnWords( QString phrase, effectType fX )
+{
+ int wordCount = 0;
+ float xCenter = 0,
+ yCenter = drand48()*40 - 20,
+ wordsWidth = 0;
+ QPtrList<Word> localWords;
+ while ( phrase.length() > 0 )
+ {
+ QString letters = phrase.section(" ",0,0);
+ Word * word = new Word( letters.latin1(), &symbolMap );
+ wordList.append( word );
+ localWords.append( word );
+ word->cX = xCenter;
+ word->cY = yCenter;
+ switch ( fX ) {
+ case Fun1:{
+ float angle = 2*M_PI * drand48(),
+ module = 0.25 * (drand48() + drand48());
+ word->vX = module * cos( angle );
+ word->vY = module * sin( angle );
+ word->vScale = 0.6;
+ word->scale = 0.7 + 0.3*(drand48() + drand48());}
+ word->activateTime = 0.3 * wordCount;
+ //fall to the case below for word spacing
+ default:
+ case NoEffect:
+ wordsWidth += word->width;
+ word->cX += wordsWidth;
+ wordsWidth += word->width + 1;
+ break;
+ case Sequence:
+ word->lifeTime = 1.2;
+ word->activateTime = 0.6 + 0.9 * wordCount;
+// word->vY = -5;
+ break;
+ }
+ wordCount ++;
+ phrase.remove(0, letters.length() + 1);
+ }
+ if ( localWords.count() < 1 )
+ return;
+ //some computations to 'center' the string
+ float displace = -(wordsWidth - 1) / 2;
+ Word * word = localWords.first();
+ for( ; word; word = localWords.next() )
+ word->cX += displace;
+}
+
+void Writer::render( double dT )
+{
+ if ( !numTextures )
+ return;
+
+ glEnable( GL_TEXTURE_2D );
+
+ glPushMatrix();
+ glScalef( 0.6, 0.6, 1.0 );
+ Word * word = wordList.first();
+ while( word ) {
+ word->renderWord( dT );
+ if ( word->isDead() ) {
+ wordList.remove();
+ word = wordList.current();
+ } else
+ word = wordList.next();
+ }
+ glPopMatrix();
+}
+
+/* loadMap()
+ * parses the description file to create the internal symbols map.
+ * This map is then used when building words.
+ **/
+bool Writer::loadMap( QString descFile )
+{
+ QFile desc( locate("data","kfiresaver/"+descFile) );
+ if ( !desc.open( IO_ReadOnly ) )
+ return false;
+
+ unsigned int currentNumber;
+ float xres = 0, yres = 0;
+ bool generatedFirst = false;
+
+ while ( !desc.atEnd() )
+ {
+ QString line;
+ int count = desc.readLine( line, 100 );
+ //skip comments / invalid lines
+ if ( count < 6 || line.at(0) == '#')
+ continue;
+ //load texture maps
+ if ( line.at(0) == '"' && numTextures < 15 )
+ {
+ //load and generate texture
+ QString fileName = line.section("\"", 1,1 );
+ QImage tmp;
+ if ( !tmp.load( locate("data","kfiresaver/"+fileName) ) ) {
+ kdWarning() << "can't load filename:" << fileName << endl;
+ generatedFirst = false;
+ continue;
+ }
+ glGenTextures( 1, &currentNumber );
+ texArray[ numTextures++ ] = currentNumber;
+ glBindTexture(GL_TEXTURE_2D, currentNumber);
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ QImage texture = QGLWidget::convertToGLFormat( tmp );
+ xres = (float)texture.width();
+ yres = (float)texture.height();
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)xres, (int)yres, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, texture.bits());
+ generatedFirst = true;
+ continue;
+ }
+ if ( !generatedFirst )
+ continue;
+ if ( line.contains(' ') != 4 ) {
+ kdWarning() << "wrong line on symbols.desc (4 spaces expected):" << endl;
+ kdWarning() << " '" << line << "'" << endl;
+ continue;
+ }
+ //parse the line describing a symbol and create it
+ char p = *(line.latin1());
+ if ( symbolMap.contains(p) )
+ continue;
+ float left = (float)(line.section(" ",1,1).toInt())/xres,
+ top = (float)(line.section(" ",2,2).toInt())/yres,
+ right = (float)(line.section(" ",3,3).toInt() + 1)/xres,
+ bottom = (float)(line.section(" ",4,4).toInt() + 1)/yres;
+ symbolMap[p] = new Symbol( currentNumber, left,top,right,bottom );
+ }
+
+ return symbolMap.size() > 0;
+}
diff --git a/kscreensaver/kdesavers/firesaverwriter.h b/kscreensaver/kdesavers/firesaverwriter.h
new file mode 100644
index 00000000..b7bd2e78
--- /dev/null
+++ b/kscreensaver/kdesavers/firesaverwriter.h
@@ -0,0 +1,113 @@
+/***************************************************************************
+ * Copyright (C) 2004 by E.Ros *
+ * rosenric@dei.unipd.it *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef FIRESAVER_WRITER_H
+#define FIRESAVER_WRITER_H
+
+#include <qgl.h>
+#include <qptrlist.h>
+#include <qmap.h>
+#include <qstring.h>
+
+class Symbol
+{
+ public:
+ Symbol( unsigned int textureNumber, float l, float t, float r, float b )
+ : scale((r - l) / (b - t)), texNum(textureNumber), L(l), T(1-t), R(r), B(1-b)
+ {
+ v1[0] = -scale; v1[1] = 1;
+ v2[0] = -scale; v2[1] = -1;
+ v3[0] = scale; v3[1] = 1;
+ v4[0] = scale; v4[1] = -1;
+ }
+
+ float scale;
+
+ inline void renderSymbol()
+ {
+ //draw the symbol and update "cursor"'s position
+ glBindTexture( GL_TEXTURE_2D, texNum );
+ glTranslatef( scale, 0, 0 );
+ glBegin( GL_TRIANGLE_STRIP );
+ glTexCoord2f( L, T );
+ glVertex2fv( v1 );
+ glTexCoord2f( L, B );
+ glVertex2fv( v2 );
+ glTexCoord2f( R, T );
+ glVertex2fv( v3 );
+ glTexCoord2f( R, B );
+ glVertex2fv( v4 );
+ glEnd();
+ glTranslatef( scale, 0, 0 );
+ }
+
+ private:
+ float v1[2], v2[2], v3[2], v4[2];
+ unsigned int texNum; //number of texture to activate
+ float L, T, R, B; //coordinates for mapping
+};
+
+
+class Word
+{
+ friend class Writer;
+ public:
+ Word( const char * text, QMap<char, Symbol *> * map, float scale = 1.0 );
+
+ inline void renderWord( double dT );
+ inline bool isDead();
+
+ private:
+ float width, scale, cX, cY;
+ float vScale, vX, vY;
+ float activateTime, lifeTime, currentTime;
+ float color[4];
+ QPtrList<Symbol> symbolList;
+};
+
+
+/*
+ *
+ **/
+class Writer
+{
+ public:
+ Writer( QString descFileName );
+ ~Writer();
+
+ //types of effects implemented
+ enum effectType { NoEffect = 0, Sequence, Fun1, Fun2 };
+
+ //call this function to add a sentence to the renderer
+ void spawnWords( QString phrase, effectType fx = NoEffect );
+
+ //called to get the words on screen using OpenGL
+ //Note: the context must be set up. Words are drawn on XY plane
+ //inside a rectangle with 10 units's side.
+ void render( double dT );
+
+ private:
+ //misc utility functions
+ bool loadMap( QString );
+
+ //texture 'references' used by GL to delete allocated textures
+ int numTextures;
+ unsigned int texArray[16];
+
+ //list of words and map of symbols
+ QPtrList<Word> wordList;
+ QMap<char, Symbol *> symbolMap;
+
+ //disables standard constructor
+ Writer();
+};
+
+#endif
diff --git a/kscreensaver/kdesavers/fountain.cpp b/kscreensaver/kdesavers/fountain.cpp
new file mode 100644
index 00000000..51d88343
--- /dev/null
+++ b/kscreensaver/kdesavers/fountain.cpp
@@ -0,0 +1,461 @@
+//-----------------------------------------------------------------------------
+//
+// kfountain - Partical Fountain Screen Saver for KDE 2
+//
+// Copyright (c) Ian Reinhart Geiser 2001
+//
+// KConfig code and KScreenSaver "Setup..." improvements by
+// Nick Betcher <nbetcher@usinternet.com> 2001
+//
+#include <stdlib.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kcolordialog.h>
+#include <kbuttonbox.h>
+#include <kcolorbutton.h>
+#include <kglobal.h>
+#include "fountain.h"
+#include "fountain.moc"
+#ifdef Q_WS_MACX
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#else
+#include <GL/glu.h>
+#include <GL/gl.h>
+#endif
+#include <qimage.h>
+#include <kdebug.h>
+#include <qpainter.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <kstandarddirs.h>
+#include <math.h>
+#include <kmessagebox.h>
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kfountain.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Particle Fountain Screen Saver" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KFountainSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KFountainSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// dialog to setup screen saver parameters
+//
+KFountainSetup::KFountainSetup( QWidget *parent, const char *name )
+ : SetupUi( parent, name, TRUE )
+{
+ readSettings();
+
+ //QLabel *label;
+ //QPushButton *button;
+
+ //setCaption( i18n("Setup Particle Fountain") );
+
+ //QVBoxLayout *tl = new QVBoxLayout(this, 10);
+ //QHBoxLayout *tl1 = new QHBoxLayout;
+ //tl->addLayout(tl1);
+
+ //QVBoxLayout *tl11 = new QVBoxLayout(5);
+ //tl1->addLayout(tl11);
+
+ //label = new QLabel( i18n("No options here yet...:"), this );
+ ///tl11->addWidget(label);;
+
+ //preview = new QWidget( this );
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new KFountainSaver( preview->winId() );
+ //tl1->addWidget(preview);
+
+ //KButtonBox *bbox = new KButtonBox(this);
+ //bbox->addStretch(1);
+;
+ connect( PushButton1, SIGNAL( clicked() ), SLOT( slotOkPressed() ) );
+ connect( PushButton2, SIGNAL( clicked() ), SLOT( reject() ) );
+ connect( PushButton3, SIGNAL( clicked() ), SLOT( aboutPressed() ) );
+ connect( SpinBox1, SIGNAL( valueChanged(int)), saver, SLOT( updateSize(int)));
+ connect( RadioButton1, SIGNAL( toggled(bool)), saver, SLOT( doStars(bool)));
+
+}
+
+// read settings from config file
+void KFountainSetup::readSettings()
+{
+ KConfig config("kssfountainrc", false, false);
+
+ config.setGroup( "Settings" );
+ QString boolval = config.readEntry( "Stars", "false" );
+ if (boolval == "true") {
+ RadioButton1->setDown(true);
+ RadioButton1_2->setDown(false);
+ } else {
+ if (boolval == "false")
+ {
+ RadioButton1->setDown(false);
+ RadioButton1_2->setDown(true);
+ }
+ }
+
+ QString starammount = config.readEntry("StarSize", "75");
+ SpinBox1->setValue(starammount.toInt());
+
+}
+
+// Ok pressed - save settings and exit
+void KFountainSetup::slotOkPressed()
+{
+ KConfig config("kssfountainrc", false, false);
+ config.setGroup( "Settings" );
+
+ if (RadioButton1->isOn() == true)
+ {
+ config.writeEntry( "Stars", "true" );
+ } else {
+ if (RadioButton1_2->isOn() == true)
+ {
+ config.writeEntry( "Stars", "false" );
+ }
+ }
+ config.writeEntry( "StarSize", QString::number(SpinBox1->value()) );
+
+ config.sync();
+
+ accept();
+}
+
+void KFountainSetup::aboutPressed()
+{
+ KMessageBox::about(this,
+ i18n("<h3>Particle Fountain</h3>\n<p>Particle Fountain Screen Saver for KDE</p>\nCopyright (c) Ian Reinhart Geiser 2001<br>\n\n<p>KConfig code and KScreenSaver \"Setup...\" improvements by Nick Betcher <nbetcher@usinternet.com> 2001</p>"));
+}
+//-----------------------------------------------------------------------------
+
+
+KFountainSaver::KFountainSaver( WId id ) : KScreenSaver( id )
+{
+
+ kdDebug() << "Blank" << endl;
+
+ timer = new QTimer( this );
+ timer->start( 25, TRUE );
+ setBackgroundColor( black );
+ erase();
+ fountain = new Fountain();
+ embed(fountain);
+ fountain->show();
+ connect( timer, SIGNAL(timeout()), this, SLOT(blank()) );
+}
+
+KFountainSaver::~KFountainSaver()
+{
+
+}
+
+// read configuration settings from config file
+void KFountainSaver::readSettings()
+{
+// Please remove me
+
+}
+
+void KFountainSaver::blank()
+{
+ // Play fountain
+
+ fountain->updateGL();
+ timer->start( 25, TRUE );
+
+}
+Fountain::Fountain( QWidget * parent, const char * name) : QGLWidget (parent,name)
+{
+ rainbow=true;
+ slowdown=2.0f;
+ zoom=-40.0f;
+ index=0;
+ size = 0.75f;
+ obj = gluNewQuadric();
+
+// This has to be here because you can't update the fountain until 'fountain' is created!
+ KConfig config("kssfountainrc", false, false);
+ config.setGroup( "Settings" );
+ QString boolval = config.readEntry( "Stars", "false" );
+ if (boolval == "true") {
+ setStars(true);
+ } else {
+ if (boolval == "false")
+ {
+ setStars(false);
+ }
+ }
+
+ QString starammount = config.readEntry("StarSize", "75");
+ float passvalue = (starammount.toInt() / 100.0);
+ setSize(passvalue);
+
+}
+
+Fountain::~Fountain()
+{
+ glDeleteTextures( 1, &texture[0] );
+ gluDeleteQuadric(obj);
+}
+
+/** load the particle file */
+bool Fountain::loadParticle()
+{
+ /* Status indicator */
+ bool Status = TRUE;
+ QImage buf;
+
+ kdDebug() << "Loading: " << locate("data", "kscreensaver/particle.png") << endl;
+ if (buf.load( locate("data", "kscreensaver/particle.png") ) )
+
+ {
+ tex = convertToGLFormat(buf); // flipped 32bit RGBA
+ kdDebug() << "Texture loaded: " << tex.numBytes () << endl;
+ }
+ else
+ {
+ QImage dummy( 32, 32, 32 );
+ dummy.fill( Qt::white.rgb() );
+ buf = dummy;
+ tex = convertToGLFormat( buf );
+ }
+
+ /* Set the status to true */
+ //Status = TRUE;
+ glGenTextures(1, &texture[0]); /* create three textures */
+ glBindTexture(GL_TEXTURE_2D, texture[0]);
+ /* use linear filtering */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ /* actually generate the texture */
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
+
+
+
+ return Status;
+}
+/** setup the GL enviroment */
+void Fountain::initializeGL ()
+{
+
+ kdDebug() << "InitGL" << endl;
+ GLfloat colors[12][3]=
+ {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},
+ {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},
+ {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}};
+
+ if (loadParticle()) // Jump To Texture Loading Routine
+ {
+ /* Enable smooth shading */
+ glShadeModel( GL_SMOOTH );
+
+ /* Set the background black */
+ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
+
+ /* Depth buffer setup */
+ glClearDepth( 1.0f );
+
+ /* Enables Depth Testing */
+ glDisable( GL_DEPTH_TEST );
+
+ /* Enable Blending */
+ glEnable( GL_BLEND );
+ /* Type Of Blending To Perform */
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE );
+
+
+ /* Really Nice Perspective Calculations */
+ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
+ /* Really Nice Point Smoothing */
+ glHint( GL_POINT_SMOOTH_HINT, GL_NICEST );
+
+ /* Enable Texture Mapping */
+ glEnable( GL_TEXTURE_2D );
+ /* Select Our Texture */
+ glBindTexture( GL_TEXTURE_2D, texture[0] );
+
+ for (loop=0;loop<MAX_PARTICLES;loop++) // Initials All The Textures
+ {
+ particle[loop].active=true; // Make All The Particles Active
+ particle[loop].life=1.0f; // Give All The Particles Full Life
+ particle[loop].fade=float(KApplication::random()%100)/1000.0f+0.003f; // Random Fade Speed
+ particle[loop].r=colors[(loop+1)/(MAX_PARTICLES/12)][0]; // Select Red Rainbow Color
+ particle[loop].g=colors[(loop+1)/(MAX_PARTICLES/12)][1]; // Select Green Rainbow Color
+ particle[loop].b=colors[(loop+1)/(MAX_PARTICLES/12)][2]; // Select Blue Rainbow Color
+ particle[loop].xi=float((KApplication::random()%50)-26.0f)*10.0f; // Random Speed On X Axis
+ particle[loop].yi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Y Axis
+ particle[loop].zi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Z Axis
+ particle[loop].xg=0.0f; // Set Horizontal Pull To Zero
+ particle[loop].yg=-0.8f; // Set Vertical Pull Downward
+ particle[loop].zg=0.0f; // Set Pull On Z Axis To Zero
+ particle[loop].size=size; // Set particle size.
+ }
+ }
+ else
+ exit(0);
+}
+/** resize the gl view */
+void Fountain::resizeGL ( int width, int height )
+{
+ kdDebug() << "ResizeGL " << width << "," <<height<< endl;
+ if (height==0) // Prevent A Divide By Zero By
+ {
+ height=1; // Making Height Equal One
+ }
+
+ glViewport(0,0,width,height); // Reset The Current Viewport
+
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+
+ // Calculate The Aspect Ratio Of The Window
+ gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,200.0f);
+
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glLoadIdentity();
+}
+/** paint the GL view */
+void Fountain::paintGL ()
+{
+ //kdDebug() << "PaintGL" << endl;
+
+ GLfloat colors[12][3]=
+ {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},
+ {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},
+ {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}};
+ col = ( ++col ) % 12;
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
+
+ glLoadIdentity();
+ // Reset The ModelView Matrix
+ transIndex++;
+ glTranslatef( GLfloat(5.0*sin(4*3.14*transIndex/360)), GLfloat(4.0*cos(2*3.14*transIndex/360)), 0.0 );
+ xspeed = GLfloat(100.0*cos(3*3.14*transIndex/360)+100);
+ yspeed = GLfloat(100.0*sin(3*3.14*transIndex/360)+100);
+ //slowdown = GLfloat(4.0*sin(2*3.14*transIndex/360)+4.01);
+
+ for (loop=0;loop<MAX_PARTICLES;loop++) // Loop Through All The Particles
+ {
+ if (particle[loop].active) // If The Particle Is Active
+ {
+ float x=particle[loop].x; // Grab Our Particle X Position
+ float y=particle[loop].y; // Grab Our Particle Y Position
+ float z=particle[loop].z+zoom; // Particle Z Pos + Zoom
+ /* Select Our Texture */
+
+ /* Draw The Particle Using Our RGB Values,
+ * Fade The Particle Based On It's Life
+ */
+
+ glColor4f( particle[loop].r,
+ particle[loop].g,
+ particle[loop].b,
+ particle[loop].life );
+
+ /* Build Quad From A Triangle Strip */
+ if( !stars )
+ glBegin( GL_TRIANGLE_STRIP );
+ else
+ glBegin( GL_TRIANGLE_FAN );
+ /* Top Right */
+ glTexCoord2d( 1, 1 );
+ glVertex3f( x + particle[loop].size, y + particle[loop].size, z );
+ /* Top Left */
+ glTexCoord2d( 0, 1 );
+ glVertex3f( x - particle[loop].size, y + particle[loop].size, z );
+ /* Bottom Right */
+ glTexCoord2d( 1, 0 );
+ glVertex3f( x + particle[loop].size, y - particle[loop].size, z );
+ /* Bottom Left */
+ glTexCoord2d( 0, 0 );
+ glVertex3f( x - particle[loop].size, y - particle[loop].size, z );
+ glEnd( );
+
+ particle[loop].x+=particle[loop].xi/(slowdown*1000);// Move On The X Axis By X Speed
+ particle[loop].y+=particle[loop].yi/(slowdown*1000);// Move On The Y Axis By Y Speed
+ particle[loop].z+=particle[loop].zi/(slowdown*1000);// Move On The Z Axis By Z Speed
+
+ particle[loop].xi+=particle[loop].xg; // Take Pull On X Axis Into Account
+ particle[loop].yi+=particle[loop].yg; // Take Pull On Y Axis Into Account
+ particle[loop].zi+=particle[loop].zg; // Take Pull On Z Axis Into Account
+ particle[loop].life-=particle[loop].fade; // Reduce Particles Life By 'Fade'
+
+ if (particle[loop].life<0.0f) // If Particle Is Burned Out
+ {
+ particle[loop].life=2.0f; // Give It New Life
+ particle[loop].fade=float(KApplication::random()%100)/1000.0f+0.003f; // Random Fade Value
+ particle[loop].x=0.0f; // Center On X Axis
+ particle[loop].y=0.0f; // Center On Y Axis
+ particle[loop].z=0.0f; // Center On Z Axis
+ particle[loop].xi=xspeed+float((KApplication::random()%60)-32.0f); // X Axis Speed And Direction
+ particle[loop].yi=yspeed+float((KApplication::random()%60)-30.0f); // Y Axis Speed And Direction
+ particle[loop].zi=float((KApplication::random()%60)-30.0f); // Z Axis Speed And Direction
+ particle[loop].r=colors[col][0]; // Select Red From Color Table
+ particle[loop].g=colors[col][1]; // Select Green From Color Table
+ particle[loop].b=colors[col][2]; // Select Blue From Color Table
+ particle[loop].size=size;
+ if ((1+(random()%20)) == 10)
+ {
+ // Explode
+ particle[loop].active=true; // Make All The Particles Active
+ particle[loop].life=1.0f; // Give All The Particles Full Life
+ particle[loop].fade=float(KApplication::random()%100)/1000.0f+0.003f; // Random Fade Speed
+ particle[loop].r=colors[(loop+1)/(MAX_PARTICLES/12)][0]; // Select Red Rainbow Color
+ particle[loop].g=colors[(loop+1)/(MAX_PARTICLES/12)][1]; // Select Green Rainbow Color
+ particle[loop].b=colors[(loop+1)/(MAX_PARTICLES/12)][2]; // Select Blue Rainbow Color
+ particle[loop].xi=float((KApplication::random()%50)-26.0f)*10.0f; // Random Speed On X Axis
+ particle[loop].yi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Y Axis
+ particle[loop].zi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Z Axis
+ particle[loop].xg=0.0f; // Set Horizontal Pull To Zero
+ particle[loop].yg=-0.8f; // Set Vertical Pull Downward
+ particle[loop].zg=0.0f; // Set Pull On Z Axis To Zero
+ particle[loop].size=size; // Set particle size.
+ }
+ }
+ // Lets stir some things up
+ index += 0.001;
+ particle[loop].yg =2.0*sin(2*3.14*transIndex/360);
+ particle[loop].xg =2.0*cos(2*3.14*transIndex/360);
+ particle[loop].zg =4.0+(4.0*cos(2*3.14*transIndex/360));
+
+ }
+ }
+
+ glFlush();
+}
+void Fountain::setSize( float newSize )
+{
+ size = newSize;
+}
+void Fountain::setStars( bool doStars )
+{
+ stars = doStars;
+}
+
+void KFountainSaver::updateSize(int newSize)
+{
+ fountain->setSize(newSize/100);
+}
+void KFountainSaver::doStars(bool starState)
+{
+ fountain->setStars(starState);
+}
+
diff --git a/kscreensaver/kdesavers/fountain.h b/kscreensaver/kdesavers/fountain.h
new file mode 100644
index 00000000..fa89e6f8
--- /dev/null
+++ b/kscreensaver/kdesavers/fountain.h
@@ -0,0 +1,140 @@
+//-----------------------------------------------------------------------------
+//
+// kfountain - Partical Fountain Screen Saver for KDE 2
+//
+// Copyright (c) Ian Reinhart Geiser 2001
+//
+/////
+//NOTE:
+// The base particle engine did not come from me, it was designed by Jeff Molofee <nehe@connect.ab.ca>
+// I did some extensive modifications to make it work with QT's OpenGL but the base principal is about
+// the same.
+////
+
+#ifndef __FOUNTAIN_H__
+#define __FOUNTAIN_H__
+
+#include <qdialog.h>
+#include <qgl.h>
+#ifdef Q_WS_MACX
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#else
+#include <GL/glu.h>
+#include <GL/gl.h>
+#endif
+#include <kscreensaver.h>
+#include <qtimer.h>
+#include <qimage.h>
+#include "fountaincfg.h"
+#include <kinstance.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+#define MAX_PARTICLES 1000
+
+
+class Fountain : public QGLWidget
+{
+Q_OBJECT
+ class particles // Create A Structure For Particle
+ {
+ public:
+ bool active; // Active (Yes/No)
+ float life; // Particle Life
+ float fade; // Fade Speed
+ float r; // Red Value
+ float g; // Green Value
+ float b; // Blue Value
+ float x; // X Position
+ float y; // Y Position
+ float z; // Z Position
+ float xi; // X Direction
+ float yi; // Y Direction
+ float zi; // Z Direction
+ float xg; // X Gravity
+ float yg; // Y Gravity
+ float zg; // Z Gravity
+ float size; // Particle Size
+ };
+
+public:
+ Fountain( QWidget * parent=0, const char * name=0 );
+ ~Fountain();
+ void setSize( float newSize );
+ void setStars( bool doStars );
+protected:
+ /** paint the GL view */
+ void paintGL ();
+ /** resize the gl view */
+ void resizeGL ( int w, int h );
+ /** setup the GL enviroment */
+ void initializeGL ();
+
+
+private:
+ /** load the partical file */
+ bool loadParticle();
+
+ particles particle[MAX_PARTICLES];
+
+
+ bool rainbow; // Rainbow Mode?
+ bool sp; // Spacebar Pressed?
+ bool rp; // Enter Key Pressed?
+
+ float slowdown; // Slow Down Particles
+ float xspeed; // Base X Speed (To Allow Keyboard Direction Of Tail)
+ float yspeed; // Base Y Speed (To Allow Keyboard Direction Of Tail)
+ float zoom; // Used To Zoom Out
+ float size;
+ float stars;
+ GLuint loop; // Misc Loop Variable
+ GLuint col; // Current Color Selection
+ GLuint delay; // Rainbow Effect Delay
+ GLuint texture[1];
+ QImage tex;
+ float index;
+ float transIndex;
+ GLfloat scale;
+ GLUquadricObj *obj;
+};
+
+class KFountainSaver : public KScreenSaver
+{
+Q_OBJECT
+public:
+ KFountainSaver( WId drawable );
+ virtual ~KFountainSaver();
+ void readSettings();
+public slots:
+ void blank();
+ void updateSize(int newSize);
+ void doStars(bool starState);
+// void loadTextures(bool textures);
+private:
+ Fountain *fountain;
+ QTimer *timer;
+};
+
+class KFountainSetup : public SetupUi
+{
+ Q_OBJECT
+public:
+ KFountainSetup( QWidget *parent = NULL, const char *name = NULL );
+
+protected:
+ void readSettings();
+
+private slots:
+ void slotOkPressed();
+ void aboutPressed();
+private:
+ KFountainSaver *saver;
+ float size;
+ float stars;
+};
+
+#endif
+
+
diff --git a/kscreensaver/kdesavers/fountaincfg.ui b/kscreensaver/kdesavers/fountaincfg.ui
new file mode 100644
index 00000000..94759b2f
--- /dev/null
+++ b/kscreensaver/kdesavers/fountaincfg.ui
@@ -0,0 +1,192 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SetupUi</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SetupUi</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>209</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>209</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>400</width>
+ <height>250</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Particle Fountain Setup</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Use textures</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;About</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="0">
+ <property name="name">
+ <cstring>SpinBox1</cstring>
+ </property>
+ <property name="maxValue">
+ <number>500</number>
+ </property>
+ <property name="minValue">
+ <number>25</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>75</number>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="0">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Shapes</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Stars</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Flares</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget" row="0" column="1" rowspan="4" colspan="2">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Particle size:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>RadioButton1_2</sender>
+ <signal>pressed()</signal>
+ <receiver>RadioButton1</receiver>
+ <slot>toggle()</slot>
+ </connection>
+ <connection>
+ <sender>RadioButton1</sender>
+ <signal>pressed()</signal>
+ <receiver>RadioButton1_2</receiver>
+ <slot>toggle()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kscreensaver/kdesavers/gravity.cpp b/kscreensaver/kdesavers/gravity.cpp
new file mode 100644
index 00000000..d9f9bbd1
--- /dev/null
+++ b/kscreensaver/kdesavers/gravity.cpp
@@ -0,0 +1,419 @@
+//-----------------------------------------------------------------------------
+//
+// kgravity - Partical Gravity Screen Saver for KDE 2
+//
+// Copyright (c) Ian Reinhart Geiser 2001
+//
+// KConfig code and KScreenSaver "Setup..." improvements by
+// Nick Betcher <nbetcher@usinternet.com> 2001
+//
+#include <stdlib.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kcolordialog.h>
+#include <kbuttonbox.h>
+#include <kcolorbutton.h>
+#include "gravity.h"
+#include "gravity.moc"
+#ifdef Q_WS_MACX
+#include <OpenGL/glu.h>
+#include <OpenGL/gl.h>
+#else
+#include <GL/glu.h>
+#include <GL/gl.h>
+#endif
+#include <qimage.h>
+#include <kdebug.h>
+#include <qpainter.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <kstandarddirs.h>
+#include <math.h>
+#include <kmessagebox.h>
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kgravity.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Particle Gravity Screen Saver" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KGravitySaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KGravitySetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// dialog to setup screen saver parameters
+//
+KGravitySetup::KGravitySetup( QWidget *parent, const char *name )
+ : SetupUi( parent, name, TRUE )
+{
+ readSettings();
+
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+#ifdef Q_WS_X11
+ preview->show(); // otherwise saver does not get correct size
+#endif
+ saver = new KGravitySaver( preview->winId() );
+;
+ connect( PushButton1, SIGNAL( clicked() ), SLOT( slotOkPressed() ) );
+ connect( PushButton2, SIGNAL( clicked() ), SLOT( reject() ) );
+ connect( PushButton3, SIGNAL( clicked() ), SLOT( aboutPressed() ) );
+ connect( SpinBox1, SIGNAL( valueChanged(int)), saver, SLOT( updateSize(int)));
+ connect( RadioButton1, SIGNAL( toggled(bool)), saver, SLOT( doStars(bool)));
+
+}
+
+KGravitySetup::~KGravitySetup()
+{
+ delete saver;
+}
+
+// read settings from config file
+void KGravitySetup::readSettings()
+{
+ KConfig config("kssgravityrc", false, false);
+
+ config.setGroup( "Settings" );
+ QString boolval = config.readEntry( "Stars", "false" );
+ if (boolval == "true") {
+ RadioButton1->setDown(true);
+ RadioButton1_2->setDown(false);
+ } else {
+ if (boolval == "false")
+ {
+ RadioButton1->setDown(false);
+ RadioButton1_2->setDown(true);
+ }
+ }
+
+ QString starammount = config.readEntry("StarSize", "75");
+ SpinBox1->setValue(starammount.toInt());
+
+}
+
+// Ok pressed - save settings and exit
+void KGravitySetup::slotOkPressed()
+{
+ KConfig config("kssgravityrc", false, false);
+ config.setGroup( "Settings" );
+
+ if (RadioButton1->isOn() == true)
+ {
+ config.writeEntry( "Stars", "true" );
+ } else {
+ if (RadioButton1_2->isOn() == true)
+ {
+ config.writeEntry( "Stars", "false" );
+ }
+ }
+ config.writeEntry( "StarSize", QString::number(SpinBox1->value()) );
+
+ config.sync();
+
+ accept();
+}
+
+void KGravitySetup::aboutPressed()
+{
+ KMessageBox::about(this,
+ i18n("<h3>Gravity</h3>\n<p>Particle Gravity Screen Saver for KDE</p>\nCopyright (c) Ian Reinhart Geiser 2001<br>\n\n<p>KConfig code and KScreenSaver \"Setup...\" improvements by Nick Betcher <nbetcher@usinternet.com> 2001</p>"));
+}
+//-----------------------------------------------------------------------------
+
+
+KGravitySaver::KGravitySaver( WId id ) : KScreenSaver( id )
+{
+
+ kdDebug() << "Blank" << endl;
+
+ timer = new QTimer( this );
+ timer->start( 25, TRUE );
+ setBackgroundColor( black );
+ erase();
+ gravity = new Gravity();
+ embed(gravity);
+#ifdef Q_WS_X11
+ gravity->show();
+#endif
+ connect( timer, SIGNAL(timeout()), this, SLOT(blank()) );
+}
+
+KGravitySaver::~KGravitySaver()
+{
+
+}
+
+// read configuration settings from config file
+void KGravitySaver::readSettings()
+{
+// Please remove me
+
+}
+
+void KGravitySaver::blank()
+{
+ // Play gravity
+
+ gravity->updateGL();
+ timer->start( 25, TRUE );
+
+}
+Gravity::Gravity( QWidget * parent, const char * name) : QGLWidget (parent,name)
+{
+ rainbow=true;
+ slowdown=2.0f;
+ zoom=-50.0f;
+ index=0;
+ size = 3.95f;
+// obj = gluNewQuadric();
+
+// This has to be here because you can't update the gravity until 'gravity' is created!
+ KConfig config("kssgravityrc", false, false);
+ config.setGroup( "Settings" );
+ QString boolval = config.readEntry( "Stars", "false" );
+ if (boolval == "true") {
+ setStars(true);
+ } else {
+ if (boolval == "false")
+ {
+ setStars(false);
+ }
+ }
+
+ QString starammount = config.readEntry("StarSize", "75");
+ float passvalue = (starammount.toInt() / 100.0);
+ setSize(passvalue);
+
+}
+
+Gravity::~Gravity()
+{
+ glDeleteTextures( 1, &texture[0] );
+ gluDeleteQuadric(obj);
+}
+
+/** load the particle file */
+bool Gravity::loadParticle()
+{
+ /* Status indicator */
+ bool Status = TRUE;
+ QImage buf;
+
+ kdDebug() << "Loading: " << locate("data", "kscreensaver/particle.png") << endl;
+ if (buf.load( locate("data", "kscreensaver/particle.png") ) )
+
+ {
+ tex = convertToGLFormat(buf); // flipped 32bit RGBA
+ kdDebug() << "Texture loaded: " << tex.numBytes () << endl;
+ }
+ else
+ {
+ QImage dummy( 32, 32, 32 );
+ dummy.fill( Qt::white.rgb() );
+ buf = dummy;
+ tex = convertToGLFormat( buf );
+ }
+
+ /* Set the status to true */
+ //Status = TRUE;
+ glGenTextures(1, &texture[0]); /* create three textures */
+ glBindTexture(GL_TEXTURE_2D, texture[0]);
+ /* use linear filtering */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ /* actually generate the texture */
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
+
+
+
+ return Status;
+}
+/** setup the GL enviroment */
+void Gravity::initializeGL ()
+{
+
+ kdDebug() << "InitGL" << endl;
+
+ if (loadParticle()) // Jump To Texture Loading Routine
+ {
+ /* Enable smooth shading */
+ glShadeModel( GL_SMOOTH );
+
+ /* Set the background black */
+ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
+
+ /* Depth buffer setup */
+ glClearDepth( 1.0f );
+
+ /* Enables Depth Testing */
+ glDisable( GL_DEPTH_TEST );
+
+ /* Enable Blending */
+ glEnable( GL_BLEND );
+ /* Type Of Blending To Perform */
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE );
+
+
+ /* Really Nice Perspective Calculations */
+ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
+ /* Really Nice Point Smoothing */
+ glHint( GL_POINT_SMOOTH_HINT, GL_NICEST );
+
+ /* Enable Texture Mapping */
+ glEnable( GL_TEXTURE_2D );
+ /* Select Our Texture */
+ glBindTexture( GL_TEXTURE_2D, texture[0] );
+
+ for (loop=0;loop<MAX_PARTICLES;loop++) // Initials All The Textures
+ {
+ buildParticle(loop);
+ }
+ }
+ else
+ exit(0);
+}
+/** resize the gl view */
+void Gravity::resizeGL ( int width, int height )
+{
+ kdDebug() << "ResizeGL " << width << "," <<height<< endl;
+ if (height==0) // Prevent A Divide By Zero By
+ {
+ height=1; // Making Height Equal One
+ }
+
+ glViewport(0,0,width,height); // Reset The Current Viewport
+
+ glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
+ glLoadIdentity(); // Reset The Projection Matrix
+
+ // Calculate The Aspect Ratio Of The Window
+ gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
+
+ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
+ glLoadIdentity();
+}
+/** paint the GL view */
+void Gravity::paintGL ()
+{
+ //kdDebug() << "PaintGL" << endl;
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
+ glLoadIdentity();
+ // Reset The ModelView Matrix
+ transIndex++;
+ //glRotatef(transIndex, 1,0,0);
+ //glRotatef(transIndex, 0,1,0);
+ //glRotatef(transIndex, 0,0,1);
+ float xmax = 5.0;
+ float ymax = 5.0;
+ glTranslatef( GLfloat(xmax*sin(3.14*transIndex/360)-xmax),
+ GLfloat(ymax*cos(3.14*transIndex/360)-ymax),
+ 0.0 );
+ //glRotatef(transIndex, 0,GLfloat(zmax*cos(3.14*transIndex/360000)), GLfloat(zmax*cos(3.14*transIndex/360000)));
+
+ for (loop=0;loop<MAX_PARTICLES;loop++) // Loop Through All The Particles
+ {
+ if (particle[loop].active) // If The Particle Is Active
+ {
+ float x=particle[loop].x; // Grab Our Particle X Position
+ float y=particle[loop].y; // Grab Our Particle Y Position
+ float z=particle[loop].z+zoom; // Particle Z Pos + Zoom
+ /* Select Our Texture */
+
+ /* Draw The Particle Using Our RGB Values,
+ * Fade The Particle Based On It's Life
+ */
+ particle[loop].life=(particle[loop].index/particle[loop].indexo)*2.0f;
+ glColor4f( particle[loop].r,
+ particle[loop].g,
+ particle[loop].b,
+ particle[loop].life );
+
+ /* Build Quad From A Triangle Strip */
+ if( !stars )
+ glBegin( GL_TRIANGLE_STRIP );
+ else
+ glBegin( GL_TRIANGLE_FAN );
+ /* Top Right */
+ glTexCoord2d( 1, 1 );
+ glVertex3f( x + particle[loop].size, y + particle[loop].size, z );
+ /* Top Left */
+ glTexCoord2d( 0, 1 );
+ glVertex3f( x - particle[loop].size, y + particle[loop].size, z );
+ /* Bottom Right */
+ glTexCoord2d( 1, 0 );
+ glVertex3f( x + particle[loop].size, y - particle[loop].size, z );
+ /* Bottom Left */
+ glTexCoord2d( 0, 0 );
+ glVertex3f( x - particle[loop].size, y - particle[loop].size, z );
+ glEnd( );
+ particle[loop].x=(particle[loop].xo*sin(particle[loop].index))*pow((double) particle[loop].index/particle[loop].indexo,(double) 8.0);
+ particle[loop].y=(particle[loop].yo*sin(particle[loop].index))*pow((double) particle[loop].index/particle[loop].indexo,(double) 8.0);
+ particle[loop].z=(particle[loop].zo*sin(particle[loop].index))*pow((double) particle[loop].index/particle[loop].indexo,(double) 8.0);
+ particle[loop].index-=0.05;
+ if (particle[loop].index<0.0f ) // If Particle Is Burned Out
+ {
+ buildParticle(loop);
+ }
+ // Lets stir some things up
+ }
+ }
+
+ glFlush();
+}
+void Gravity::setSize( float newSize )
+{
+ size = newSize;
+}
+void Gravity::setStars( bool doStars )
+{
+ stars = doStars;
+}
+
+void KGravitySaver::updateSize(int newSize)
+{
+ gravity->setSize(newSize/100);
+}
+void KGravitySaver::doStars(bool starState)
+{
+ gravity->setStars(starState);
+}
+
+void Gravity::buildParticle(int loop)
+{
+ GLfloat colors[12][3]=
+ {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},
+ {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},
+ {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}};
+ col = ( ++col ) % 12;
+ particle[loop].active=true;
+ particle[loop].index=KApplication::random()%100;
+ particle[loop].indexo=particle[loop].index;
+ particle[loop].fade=float(KApplication::random()%100)/1000.0f+0.003f; // Random Fade Value
+ particle[loop].r=colors[col][0]; // Select Red From Color Table
+ particle[loop].g=colors[col][1]; // Select Green From Color Table
+ particle[loop].b=colors[col][2]; // Select Blue From Color Table
+ particle[loop].size=size;
+ particle[loop].x = float(KApplication::random()%100-50)*4.0;
+ particle[loop].y = float(KApplication::random()%20-10)*4.0;
+ particle[loop].z = float(KApplication::random()%100-50)*4.0;
+ particle[loop].xo = particle[loop].x;
+ if ((1+(KApplication::random() % 10) > 5))
+ particle[loop].yo = particle[loop].y;
+ else
+ particle[loop].yo = 0.0;
+ particle[loop].zo = particle[loop].z;
+
+}
+
diff --git a/kscreensaver/kdesavers/gravity.h b/kscreensaver/kdesavers/gravity.h
new file mode 100644
index 00000000..2cd7080f
--- /dev/null
+++ b/kscreensaver/kdesavers/gravity.h
@@ -0,0 +1,141 @@
+///-----------------------------------------------------------------------------
+//
+// kgravity - Partical gravity Screen Saver for KDE 2
+//
+// Copyright (c) Ian Reinhart Geiser 2001
+//
+/////
+//NOTE:
+// The base particle engine did not come from me, it was designed by Jeff Molofee <nehe@connect.ab.ca>
+// I did some extensive modifications to make it work with QT's OpenGL but the base principal is about
+// the same.
+////
+
+#ifndef __GRAVITY_H__
+#define __GRAVITY_H__
+
+#include <qdialog.h>
+#include <qgl.h>
+#ifdef Q_WS_MACX
+#include <OpenGL/glu.h>
+#include <OpenGL/gl.h>
+#else
+#include <GL/glu.h>
+#include <GL/gl.h>
+#endif
+#include <kscreensaver.h>
+#include <qtimer.h>
+#include <qimage.h>
+#include "gravitycfg.h"
+#include <kinstance.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+#define MAX_PARTICLES 100
+
+
+class Gravity : public QGLWidget
+{
+Q_OBJECT
+ class particles // Create A Structure For Particle
+ {
+ public:
+ bool active; // Active (Yes/No)
+ float life; // Particle Life
+ float fade; // Fade Speed
+ float r; // Red Value
+ float g; // Green Value
+ float b; // Blue Value
+ float x; // X Position
+ float y; // Y Position
+ float z; // Z Position
+ float xo; // X Position
+ float yo; // Y Position
+ float zo; // Z Position
+ float index; // Index
+ float indexo;
+ float size; // Particle Size
+ };
+
+public:
+ Gravity( QWidget * parent=0, const char * name=0 );
+ ~Gravity();
+ void setSize( float newSize );
+ void setStars( bool doStars );
+protected:
+ /** paint the GL view */
+ void paintGL ();
+ /** resize the gl view */
+ void resizeGL ( int w, int h );
+ /** setup the GL enviroment */
+ void initializeGL ();
+ void buildParticle(int loop);
+
+private:
+ /** load the partical file */
+ bool loadParticle();
+
+ particles particle[MAX_PARTICLES];
+
+
+ bool rainbow; // Rainbow Mode?
+ bool sp; // Spacebar Pressed?
+ bool rp; // Enter Key Pressed?
+ float slowdown; // Slow Down Particles
+ float xspeed; // Base X Speed (To Allow Keyboard Direction Of Tail)
+ float yspeed; // Base Y Speed (To Allow Keyboard Direction Of Tail)
+ float zoom; // Used To Zoom Out
+ float size;
+ float stars;
+ GLuint loop; // Misc Loop Variable
+ GLuint col; // Current Color Selection
+ GLuint delay; // Rainbow Effect Delay
+ GLuint texture[1];
+ QImage tex;
+ float index;
+ float transIndex;
+ GLfloat scale;
+ GLUquadricObj *obj;
+};
+
+class KGravitySaver : public KScreenSaver
+{
+Q_OBJECT
+public:
+ KGravitySaver( WId drawable );
+ virtual ~KGravitySaver();
+ void readSettings();
+public slots:
+ void blank();
+ void updateSize(int newSize);
+ void doStars(bool starState);
+// void loadTextures(bool textures);
+private:
+ Gravity *gravity;
+ QTimer *timer;
+};
+
+class KGravitySetup : public SetupUi
+{
+ Q_OBJECT
+public:
+ KGravitySetup( QWidget *parent = NULL, const char *name = NULL );
+ ~KGravitySetup();
+
+protected:
+ void readSettings();
+
+private slots:
+ void slotOkPressed();
+ void aboutPressed();
+private:
+ KGravitySaver *saver;
+ float size;
+ float stars;
+ float zoom;
+ float speed;
+};
+
+#endif
+
+
diff --git a/kscreensaver/kdesavers/gravitycfg.ui b/kscreensaver/kdesavers/gravitycfg.ui
new file mode 100644
index 00000000..acdd2c80
--- /dev/null
+++ b/kscreensaver/kdesavers/gravitycfg.ui
@@ -0,0 +1,192 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SetupUi</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SetupUi</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>209</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>209</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>400</width>
+ <height>250</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Gravity Setup</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Use textures</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;About</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="0">
+ <property name="name">
+ <cstring>SpinBox1</cstring>
+ </property>
+ <property name="maxValue">
+ <number>500</number>
+ </property>
+ <property name="minValue">
+ <number>25</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>75</number>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="0">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Shapes</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Stars</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Flares</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget" row="0" column="1" rowspan="4" colspan="2">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Particle size:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>RadioButton1_2</sender>
+ <signal>pressed()</signal>
+ <receiver>RadioButton1</receiver>
+ <slot>toggle()</slot>
+ </connection>
+ <connection>
+ <sender>RadioButton1</sender>
+ <signal>pressed()</signal>
+ <receiver>RadioButton1_2</receiver>
+ <slot>toggle()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kscreensaver/kdesavers/image.png b/kscreensaver/kdesavers/image.png
new file mode 100644
index 00000000..e717cb38
--- /dev/null
+++ b/kscreensaver/kdesavers/image.png
Binary files differ
diff --git a/kscreensaver/kdesavers/kclock.cpp b/kscreensaver/kdesavers/kclock.cpp
new file mode 100644
index 00000000..ac24c4b1
--- /dev/null
+++ b/kscreensaver/kdesavers/kclock.cpp
@@ -0,0 +1,588 @@
+// $Id$
+//
+// kclock - Clock screen saver for KDE
+// Copyright (c) 2003 Melchior FRANZ
+//
+// License: GPL v2
+// Author: Melchior FRANZ <mfranz@kde.org>
+// Dependencies: libart_lgpl_2 http://www.levien.com/libart/
+//
+#include <stdlib.h>
+#include <string.h>
+
+#include <qcheckbox.h>
+#include <qcolor.h>
+#include <qdatetime.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qslider.h>
+
+#include <kapplication.h>
+#include <kcolorbutton.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <libart_lgpl/art_affine.h>
+#include <libart_lgpl/art_misc.h>
+#include <libart_lgpl/art_rgb.h>
+#include <libart_lgpl/art_rgb_svp.h>
+#include <libart_lgpl/art_svp_vpath.h>
+#include <libart_lgpl/art_svp_vpath_stroke.h>
+#include <libart_lgpl/art_vpath.h>
+
+#include "kclock.h"
+#include "kclock.moc"
+
+
+const int COLOR_BUTTON_WIDTH = 80;
+const int TIMER_INTERVALL = 100;
+const int MAX_CLOCK_SIZE = 10;
+const int DEFAULT_CLOCK_SIZE = 3;
+const bool DEFAULT_KEEP_CENTERED = false;
+
+
+
+
+extern "C" {
+ KDE_EXPORT const char *kss_applicationName = "kclock.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP("Clock");
+ KDE_EXPORT const char *kss_version = "1.0";
+
+ KDE_EXPORT KScreenSaver *kss_create(WId id) {
+ return new KClockSaver(id);
+ }
+
+ KDE_EXPORT QDialog *kss_setup() {
+ return new KClockSetup();
+ }
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+
+KClockSetup::KClockSetup(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n( "Setup Clock Screen Saver" ),
+ Ok|Cancel|Help, Ok, true),
+ m_saver(0)
+{
+ readSettings();
+
+ setButtonText( Help, i18n( "A&bout" ) );
+ QWidget *main = makeMainWidget();
+
+ QVBoxLayout *top = new QVBoxLayout(main, 0, spacingHint());
+
+ QHBoxLayout *hbox = new QHBoxLayout;
+ top->addLayout( hbox );
+
+ QGroupBox *colgroup = new QGroupBox(i18n("Colors"), main);
+ colgroup->setColumnLayout( 0, Horizontal );
+ QGridLayout *grid = new QGridLayout( colgroup->layout(),
+ 5, 2, spacingHint() );
+
+ QLabel *label = new QLabel(i18n("&Hour-hand:"), colgroup);
+ KColorButton *colorButton = new KColorButton(m_hourColor, colgroup);
+ colorButton->setFixedWidth(COLOR_BUTTON_WIDTH);
+ label->setBuddy(colorButton);
+ connect(colorButton, SIGNAL(changed(const QColor &)),
+ SLOT(slotHourColor(const QColor &)));
+ grid->addWidget( label, 1, 1 );
+ grid->addWidget( colorButton, 1, 2 );
+
+ label = new QLabel(i18n("&Minute-hand:"), colgroup);
+ colorButton = new KColorButton(m_minColor, colgroup);
+ colorButton->setFixedWidth(COLOR_BUTTON_WIDTH);
+ label->setBuddy(colorButton);
+ connect(colorButton, SIGNAL(changed(const QColor &)),
+ SLOT(slotMinColor(const QColor &)));
+ grid->addWidget( label, 2, 1 );
+ grid->addWidget( colorButton, 2, 2 );
+
+ label = new QLabel(i18n("&Second-hand:"), colgroup);
+ colorButton = new KColorButton(m_secColor, colgroup);
+ colorButton->setFixedWidth(COLOR_BUTTON_WIDTH);
+ label->setBuddy(colorButton);
+ connect(colorButton, SIGNAL(changed(const QColor &)),
+ SLOT(slotSecColor(const QColor &)));
+ grid->addWidget( label, 3, 1 );
+ grid->addWidget( colorButton, 3, 2 );
+
+ label = new QLabel(i18n("Scal&e:"), colgroup);
+ colorButton = new KColorButton(m_scaleColor, colgroup);
+ colorButton->setFixedWidth(COLOR_BUTTON_WIDTH);
+ label->setBuddy(colorButton);
+ connect(colorButton, SIGNAL(changed(const QColor &)),
+ SLOT(slotScaleColor(const QColor &)));
+ grid->addWidget( label, 4, 1 );
+ grid->addWidget( colorButton, 4, 2 );
+
+ label = new QLabel(i18n("&Background:"), colgroup);
+ colorButton = new KColorButton(m_bgndColor, colgroup);
+ colorButton->setFixedWidth(COLOR_BUTTON_WIDTH);
+ label->setBuddy(colorButton);
+ connect(colorButton, SIGNAL(changed(const QColor &)),
+ SLOT(slotBgndColor(const QColor &)));
+ grid->addWidget( label, 5, 1 );
+ grid->addWidget( colorButton, 5, 2 );
+
+ hbox->addWidget(colgroup);
+
+ QWidget *m_preview = new QWidget(main);
+ m_preview->setFixedSize(220, 165);
+ m_preview->show();
+ m_saver = new KClockSaver(m_preview->winId());
+ hbox->addWidget(m_preview);
+
+ label = new QLabel( i18n( "Si&ze:" ), main );
+ top->addWidget( label );
+ QSlider *qs = new QSlider(0, MAX_CLOCK_SIZE, 1, m_size, Horizontal, main);
+ label->setBuddy( qs );
+ qs->setTickInterval(1);
+ qs->setTickmarks(QSlider::Below);
+ connect(qs, SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int)));
+ top->addWidget( qs );
+
+ bool rtl = kapp->reverseLayout();
+ QHBox *qsscale = new QHBox(main);
+ label = new QLabel(i18n("Small"), qsscale);
+ label->setAlignment(rtl ? AlignRight : AlignLeft);
+ label = new QLabel(i18n("Medium"), qsscale);
+ label->setAlignment(AlignHCenter);
+ label = new QLabel(i18n("Big"), qsscale);
+ label->setAlignment(rtl ? AlignLeft : AlignRight);
+ top->addWidget(qsscale);
+
+ QCheckBox *keepCentered = new QCheckBox(i18n("&Keep clock centered"), main);
+ keepCentered->setChecked(m_keepCentered);
+ connect(keepCentered, SIGNAL(stateChanged(int)), SLOT(slotKeepCenteredChanged(int)));
+ top->addWidget(keepCentered);
+ top->addStretch();
+}
+
+KClockSetup::~KClockSetup()
+{
+ delete m_saver;
+}
+
+void KClockSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+
+ config->setGroup("Settings");
+ m_keepCentered = config->readBoolEntry("KeepCentered", DEFAULT_KEEP_CENTERED);
+ m_size = config->readUnsignedNumEntry("Size", DEFAULT_CLOCK_SIZE);
+ if (m_size > MAX_CLOCK_SIZE)
+ m_size = MAX_CLOCK_SIZE;
+
+ config->setGroup("Colors");
+ QColor c = Qt::black;
+ m_bgndColor = config->readColorEntry("Background", &c);
+
+ c = Qt::white;
+ m_scaleColor = config->readColorEntry("Scale", &c);
+ m_hourColor = config->readColorEntry("HourHand", &c);
+ m_minColor = config->readColorEntry("MinuteHand", &c);
+
+ c = Qt::red;
+ m_secColor = config->readColorEntry("SecondHand", &c);
+
+ if (m_saver) {
+ m_saver->setBgndColor(m_bgndColor);
+ m_saver->setScaleColor(m_scaleColor);
+ m_saver->setHourColor(m_hourColor);
+ m_saver->setMinColor(m_minColor);
+ m_saver->setSecColor(m_secColor);
+ }
+}
+
+
+void KClockSetup::slotOk()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+ config->writeEntry("Size", m_size);
+ config->writeEntry("KeepCentered", m_keepCentered);
+
+ config->setGroup("Colors");
+ config->writeEntry("Background", m_bgndColor);
+ config->writeEntry("Scale", m_scaleColor);
+ config->writeEntry("HourHand", m_hourColor);
+ config->writeEntry("MinuteHand", m_minColor);
+ config->writeEntry("SecondHand", m_secColor);
+ config->sync();
+ accept();
+}
+
+
+void KClockSetup::slotHelp()
+{
+ KMessageBox::about(this, "<qt>" + i18n(
+ "Clock Screen Saver<br>"
+ "Version 1.0<br>"
+ "<nobr>Melchior FRANZ (c) 2003</nobr>") +
+ "<br><a href=\"mailto:mfranz@kde.org\">mfranz@kde.org</a>"
+ "</qt>", QString::null, KMessageBox::AllowLink);
+}
+
+
+void KClockSetup::slotBgndColor(const QColor &color)
+{
+ m_bgndColor = color;
+ if (m_saver)
+ m_saver->setBgndColor(m_bgndColor);
+}
+
+
+void KClockSetup::slotScaleColor(const QColor &color)
+{
+ m_scaleColor = color;
+ if (m_saver)
+ m_saver->setScaleColor(m_scaleColor);
+}
+
+
+void KClockSetup::slotHourColor(const QColor &color)
+{
+ m_hourColor = color;
+ if (m_saver)
+ m_saver->setHourColor(m_hourColor);
+}
+
+
+void KClockSetup::slotMinColor(const QColor &color)
+{
+ m_minColor = color;
+ if (m_saver)
+ m_saver->setMinColor(m_minColor);
+}
+
+
+void KClockSetup::slotSecColor(const QColor &color)
+{
+ m_secColor = color;
+ if (m_saver)
+ m_saver->setSecColor(m_secColor);
+}
+
+
+void KClockSetup::slotSliderMoved(int v)
+{
+ if (m_saver)
+ m_saver->restart(m_size = v);
+}
+
+
+void KClockSetup::slotKeepCenteredChanged(int c)
+{
+ if (m_saver)
+ m_saver->setKeepCentered(m_keepCentered = c);
+}
+
+
+
+
+
+//-----------------------------------------------------------------------------
+
+KClockPainter::KClockPainter(int width, int height)
+ : m_width(width),
+ m_height(height)
+{
+ m_buf = new Q_UINT8[m_width * m_height * 3];
+ // build Cartesian coordinate system ranging from -1000 to +1000;
+ // points with positive x and y are in the top right quarter
+ m_matrix[0] = m_width / 2000.0;
+ m_matrix[1] = 0;
+ m_matrix[2] = 0;
+ m_matrix[3] = m_height / -2000.0;
+ m_matrix[4] = m_width / 2.0;
+ m_matrix[5] = m_height / 2.0;
+}
+
+
+KClockPainter::~KClockPainter()
+{
+ delete[] m_buf;
+}
+
+
+void KClockPainter::copy(KClockPainter *p)
+{
+ memcpy(m_buf, p->image(), m_width * m_height * 3);
+}
+
+
+void KClockPainter::drawToImage(QImage *q, int xoffs = 0, int yoffs = 0)
+{
+ unsigned char *src = (unsigned char *)image();
+ for (int y = 0; y < m_height; y++) {
+ QRgb *dest = reinterpret_cast<QRgb *>(q->scanLine(y + yoffs)) + xoffs;
+ for (int x = 0; x < m_width; x++, src += 3)
+ *dest++ = qRgba(src[0], src[1], src[2], 255);
+ }
+}
+
+
+void KClockPainter::setColor(const QColor &c)
+{
+ m_color = (c.red() << 24) | (c.green() << 16) | (c.blue() << 8) | 255;
+}
+
+
+void KClockPainter::setShadowColor(const QColor &c)
+{
+ m_shadow = (c.red() << 24) | (c.green() << 16) | (c.blue() << 8) | 255;
+}
+
+
+void KClockPainter::fill(const QColor &c)
+{
+ art_rgb_fill_run(m_buf, c.red(), c.green(), c.blue(), m_width * m_height);
+}
+
+
+void KClockPainter::drawRadial(double alpha, double r0, double r1, double width)
+{
+ ArtVpath *vx, *v = art_new(ArtVpath, 3);
+ v[0].code = ART_MOVETO_OPEN;
+ v[0].x = r0;
+ v[0].y = 0;
+ v[1].code = ART_LINETO;
+ v[1].x = r1;
+ v[1].y = 0;
+ v[2].code = ART_END;
+
+ double m[6] = {0, 0, 0, 0, 0, 0};
+ art_affine_rotate(m, 90 - alpha);
+ vx = art_vpath_affine_transform(v, m);
+ art_free(v);
+ v = art_vpath_affine_transform(vx, m_matrix);
+ art_free(vx);
+
+ double w = width * m_matrix[0];
+ if (w < 1.0)
+ w = 1.0;
+
+ ArtSVP *path = art_svp_vpath_stroke(v, ART_PATH_STROKE_JOIN_MITER,
+ ART_PATH_STROKE_CAP_BUTT, w, 4, .5);
+ art_rgb_svp_alpha(path, 0, 0, m_width, m_height, m_color, m_buf, 3 * m_width, 0);
+ art_svp_free(path);
+ art_free(v);
+}
+
+
+void KClockPainter::drawDisc(double r)
+{
+ ArtVpath *v, *vx = art_vpath_new_circle(0, 0, r);
+ v = art_vpath_affine_transform(vx, m_matrix);
+ art_free(vx);
+
+ ArtSVP *path = art_svp_from_vpath(v);
+ art_rgb_svp_alpha(path, 0, 0, m_width, m_height, m_color, m_buf, 3 * m_width, 0);
+ art_svp_free(path);
+
+ path = art_svp_vpath_stroke(v, ART_PATH_STROKE_JOIN_MITER,
+ ART_PATH_STROKE_CAP_BUTT, 2, 4, .5);
+ art_free(v);
+
+ art_rgb_svp_alpha(path, 0, 0, m_width, m_height, m_color, m_buf, 3 * m_width, 0);
+ art_svp_free(path);
+}
+
+
+void KClockPainter::drawHand(const QColor &c, double angle, double length,
+ double width, bool disc = true)
+{
+ const double shadow_width = 1.0;
+ setColor(m_shadow);
+ if (disc)
+ drawDisc(width * 1.3 + shadow_width);
+ drawRadial(angle, .75 * width, length + shadow_width, width + shadow_width);
+
+ setColor(c);
+ if (disc)
+ drawDisc(width * 1.3);
+ drawRadial(angle, .75 * width, length, width);
+}
+
+
+
+
+
+
+//-----------------------------------------------------------------------------
+
+KClockSaver::KClockSaver(WId id)
+ : KScreenSaver(id),
+ m_showSecond(true)
+{
+ readSettings();
+ setBackgroundColor(m_bgndColor);
+ connect(&m_timer, SIGNAL(timeout()), SLOT(slotTimeout()));
+ start(m_size);
+ m_timer.start(TIMER_INTERVALL);
+}
+
+
+KClockSaver::~KClockSaver()
+{
+ m_timer.stop();
+ stop();
+}
+
+
+void KClockSaver::start(int size)
+{
+ m_diameter = int(QMIN(width(), height()) * (size + 4) / 14.0);
+ m_x = (width() - m_diameter) / 2;
+ m_y = (height() - m_diameter) / 2;
+
+ m_image = new QImage(m_diameter, m_diameter, 32);
+ m_scale = new KClockPainter(m_diameter, m_diameter);
+ m_clock = new KClockPainter(m_diameter, m_diameter);
+
+ m_clock->setShadowColor(qRgb((m_bgndColor.red() + m_scaleColor.red()) / 2,
+ (m_bgndColor.green() + m_scaleColor.green()) / 2,
+ (m_bgndColor.blue() + m_scaleColor.blue()) / 2));
+ drawScale();
+ forceRedraw();
+}
+
+
+void KClockSaver::stop()
+{
+ delete m_clock;
+ delete m_scale;
+ delete m_image;
+}
+
+
+void KClockSaver::restart(int size)
+{
+ m_timer.stop();
+ stop();
+ start(size);
+ drawScale();
+ m_timer.start(TIMER_INTERVALL);
+}
+
+
+void KClockSaver::setKeepCentered(bool b)
+{
+ m_keepCentered = b;
+ if (b) {
+ m_x = (width() - m_diameter) / 2;
+ m_y = (height() - m_diameter) / 2;
+ }
+ forceRedraw();
+}
+
+
+void KClockSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+
+ config->setGroup("Settings");
+ m_keepCentered = config->readBoolEntry("KeepCentered", DEFAULT_KEEP_CENTERED);
+ m_size = config->readUnsignedNumEntry("Size", DEFAULT_CLOCK_SIZE);
+ if (m_size > MAX_CLOCK_SIZE)
+ m_size = MAX_CLOCK_SIZE;
+
+ config->setGroup("Colors");
+ QColor c = Qt::black;
+ m_bgndColor = config->readColorEntry("Background", &c);
+
+ c = Qt::white;
+ m_scaleColor = config->readColorEntry("Scale", &c);
+ m_hourColor = config->readColorEntry("HourHand", &c);
+ m_minColor = config->readColorEntry("MinuteHand", &c);
+
+ c = Qt::red;
+ m_secColor = config->readColorEntry("SecondHand", &c);
+}
+
+
+void KClockSaver::drawScale()
+{
+ m_scale->fill(m_bgndColor);
+ m_scale->setColor(m_scaleColor);
+
+ for (int i = 0; i < 360; i += 6)
+ if (i % 30)
+ m_scale->drawRadial(i, 920, 980, 15);
+ else
+ m_scale->drawRadial(i, 825, 980, 40);
+
+ forceRedraw();
+}
+
+
+void KClockSaver::drawClock()
+{
+ double hour_angle = m_hour * 30.0 + m_minute * .5;
+ double minute_angle = m_minute * 6.0 + m_second * .1;
+ double second_angle = m_second * 6.0;
+
+ m_clock->copy(m_scale);
+ m_clock->drawHand(m_hourColor, hour_angle, 600, 55, false);
+ m_clock->drawHand(m_minColor, minute_angle, 900, 40);
+
+ if (m_showSecond)
+ m_clock->drawHand(m_secColor, second_angle, 900, 30);
+}
+
+
+void KClockSaver::slotTimeout()
+{
+ QTime t = QTime::currentTime();
+ int s = t.second();
+ if (s == m_second)
+ return;
+
+ m_second = m_showSecond ? s : 0;
+ m_hour = t.hour();
+ m_minute = t.minute();
+
+ drawClock();
+ QPainter p(this);
+
+ if (width() < 256) {
+ // intended for the control module preview: always fill the whole area
+ QImage *img = new QImage(width(), height(), 32);
+ img->fill(qRgb(m_bgndColor.red(), m_bgndColor.green(), m_bgndColor.blue()));
+ m_clock->drawToImage(img, m_x, m_y);
+ p.drawImage(0, 0, *img);
+ delete img;
+ } else {
+ m_clock->drawToImage(m_image);
+ p.drawImage(m_x, m_y, *m_image);
+ }
+
+ if (!m_keepCentered) {
+ static int xstep = 1;
+ static int ystep = -1;
+ int i;
+
+ m_x += xstep;
+ if (m_x <= 0)
+ m_x = 0, xstep = 1;
+ else if (m_x >= (i = width() - m_diameter))
+ m_x = i, xstep = -1;
+
+ m_y += ystep;
+ if (m_y <= 0)
+ m_y = 0, ystep = 1;
+ else if (m_y >= (i = height() - m_diameter))
+ m_y = i, ystep = -1;
+ }
+}
+
+
diff --git a/kscreensaver/kdesavers/kclock.h b/kscreensaver/kdesavers/kclock.h
new file mode 100644
index 00000000..b16945d6
--- /dev/null
+++ b/kscreensaver/kdesavers/kclock.h
@@ -0,0 +1,130 @@
+// $Id$
+//
+// kclock - Clock screen saver for KDE
+// Copyright (c) 2003 Melchior FRANZ
+//
+// License: GPL v2
+// Author: Melchior FRANZ <mfranz@kde.org>
+// Dependencies: libart_lgpl_2 http://www.levien.com/libart/
+//
+#ifndef __KCLOCK_H__
+#define __KCLOCK_H__
+
+#include <qtimer.h>
+#include <kdialogbase.h>
+#include <kscreensaver.h>
+
+
+class KClockPainter
+{
+ int m_width;
+ int m_height;
+ Q_UINT8 *m_buf;
+ double m_matrix[6];
+ Q_UINT32 m_color;
+ Q_UINT32 m_shadow;
+
+ public:
+ KClockPainter(int width, int height);
+ ~KClockPainter();
+ void copy(KClockPainter *p);
+ void drawToImage(QImage *q, int x, int y);
+ inline int width() { return m_width; }
+ inline int height() { return m_height; }
+ inline void *image() { return (void *)m_buf; }
+ void setColor(const QColor &color);
+ void setShadowColor(const QColor &color);
+ void fill(const QColor &color);
+ void drawRadial(double alpha, double r0, double r1, double width);
+ void drawDisc(double radius);
+ void drawHand(const QColor &color, double angle, double length,
+ double width, bool disc);
+};
+
+
+class KClockSaver : public KScreenSaver
+{
+ Q_OBJECT
+ public:
+ KClockSaver(WId id);
+ virtual ~KClockSaver();
+ inline void setBgndColor(const QColor &c) { m_bgndColor = c; drawScale(); setBackgroundColor(c); };
+ inline void setScaleColor(const QColor &c) { m_scaleColor = c; drawScale(); };
+ inline void setHourColor(const QColor &c) { m_hourColor = c; forceRedraw(); };
+ inline void setMinColor(const QColor &c) { m_minColor = c; forceRedraw(); };
+ inline void setSecColor(const QColor &c) { m_secColor = c; forceRedraw(); };
+ void setKeepCentered(bool b);
+ void restart(int siz);
+ inline void forceRedraw() { m_second = -1; }
+
+ private:
+ void readSettings();
+ void drawScale();
+ void drawClock();
+ void start(int size);
+ void stop();
+
+ protected slots:
+ void slotTimeout();
+
+ protected:
+ QTimer m_timer;
+ QImage *m_image;
+ KClockPainter *m_scale;
+ KClockPainter *m_clock;
+
+ int m_x;
+ int m_y;
+ int m_diameter;
+ int m_size;
+ bool m_showSecond;
+ bool m_keepCentered;
+ int m_hour;
+ int m_minute;
+ int m_second;
+
+ QColor m_bgndColor;
+ QColor m_scaleColor;
+ QColor m_hourColor;
+ QColor m_minColor;
+ QColor m_secColor;
+};
+
+
+class KClockSetup : public KDialogBase
+{
+ Q_OBJECT
+ public:
+ KClockSetup(QWidget *parent = 0, const char *name = 0);
+ ~KClockSetup();
+ protected:
+ void readSettings();
+
+ private slots:
+ void slotOk();
+ void slotHelp();
+
+ void slotBgndColor(const QColor &);
+ void slotScaleColor(const QColor &);
+ void slotHourColor(const QColor &);
+ void slotMinColor(const QColor &);
+ void slotSecColor(const QColor &);
+ void slotSliderMoved(int);
+ void slotKeepCenteredChanged(int);
+
+ private:
+ KClockSaver *m_saver;
+
+ QColor m_bgndColor;
+ QColor m_scaleColor;
+ QColor m_hourColor;
+ QColor m_minColor;
+ QColor m_secColor;
+
+ int m_size;
+ bool m_keepCentered;
+};
+
+#endif
+
+
diff --git a/kscreensaver/kdesavers/kscience.png b/kscreensaver/kdesavers/kscience.png
new file mode 100644
index 00000000..19de5909
--- /dev/null
+++ b/kscreensaver/kdesavers/kscience.png
Binary files differ
diff --git a/kscreensaver/kdesavers/kvm.cpp b/kscreensaver/kdesavers/kvm.cpp
new file mode 100644
index 00000000..9d7a32fa
--- /dev/null
+++ b/kscreensaver/kdesavers/kvm.cpp
@@ -0,0 +1,384 @@
+/*-
+ * kvm.cpp - The Vm screensaver for KDE
+ * Copyright (c) 2000 by Artur Rataj
+ * This file is distributed under the terms of the GNU General Public License
+ *
+ * This file is partially based on kmatrix screen saver -- original copyright follows:
+ * kmatrix.c - The Matrix screensaver for KDE
+ * by Eric Plante Copyright (c) 1999
+ * Distributed under the Gnu Public License
+ *
+ * Much of this code taken from xmatrix.c from xscreensaver;
+ * original copyright follows:
+ * xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ */
+// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* for AIX at least */
+#include <time.h>
+
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qslider.h>
+#include <qpainter.h>
+#include <qbitmap.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+
+#ifdef DEBUG_MEM
+#include <mcheck.h>
+#endif
+
+#include "kvm.h"
+
+#include "vm.xpm"
+#include "vm.xbm"
+
+#define CHAR_HEIGHT 22
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kvm.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Virtual Machine" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new kVmSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new kVmSetup();
+ }
+}
+
+
+
+static void
+load_images (m_state *state)
+{
+ if ( QPixmap::defaultDepth() > 1 )
+ {
+ state->images = QPixmap( vm );
+ }
+ else
+ {
+ state->images = QBitmap( vm_width, vm_height, vm_bits );
+ }
+ state->image_width = state->images.width();
+ state->image_height = state->images.height();
+ state->nglyphs = state->image_height / CHAR_HEIGHT;
+}
+
+
+static m_state *
+init_pool ( QWidget *w )
+{
+ m_state *state = new m_state;
+ state->w = w;
+
+ load_images (state);
+
+ state->char_width = state->image_width / 4;
+ state->char_height = CHAR_HEIGHT;
+
+ state->grid_width = w->width() / state->char_width;
+ state->grid_height = w->height() / state->char_height;
+ state->grid_margin_x = w->width()%state->char_width/2;
+ state->grid_margin_y = w->height()%state->char_height/2;
+ state->show_threads = 1;
+ vm_init_pool( &(state->pool), state->grid_width*state->grid_height,
+ THREAD_MAX_STACK_SIZE, MAX_THREADS_NUM );
+ //vm_enable_reverse( state->pool, 1 );
+ state->modified = new char[state->grid_height*state->grid_width];
+ for( int x = 0; x < state->grid_width*state->grid_height; ++x )
+ state->modified[x] = 1;
+ return state;
+}
+
+static void
+draw_pool (m_state *state)
+{
+ int x, y;
+ struct tvm_process* curr_thread;
+
+ if( state->show_threads ) {
+ curr_thread = state->pool->processes;
+ while( curr_thread ) {
+ state->modified[curr_thread->position] = 2;
+ curr_thread = curr_thread->next;
+ }
+ }
+ for (y = 0; y < state->grid_height; y++)
+ for (x = 0; x < state->grid_width; x++) {
+ int index = state->grid_width * y + x;
+ if( state->modified[index] )
+ {
+ int op = state->pool->area[index];
+ int pos_y;
+ int pos_x = 0;
+ switch( op ) {
+ case VM_OP_STOP:
+ pos_y = 14;
+ break;
+
+ case VM_OP_EXEC:
+ pos_y = 15;
+ break;
+
+ case VM_OP_COPY:
+ pos_y = 12;
+ break;
+
+ default:
+ pos_y = op - VM_OP_PUSH;
+ if( pos_y < 0 ) {
+ pos_y = -pos_y;
+ pos_x = 1;
+ }
+ break;
+ }
+ if( state->show_threads )
+ if( state->modified[index] == 1 )
+ pos_x += 2;
+ QPainter p(state->w);
+ p.setPen( Qt::green );
+ p.setBrush( Qt::black );
+ p.drawPixmap( state->grid_margin_x + x*state->char_width,
+ state->grid_margin_y + y*state->char_height,
+ state->images, pos_x*state->char_width,
+ pos_y*state->char_height,
+ state->char_width, state->char_height );
+ --state->modified[index];
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+kVmSaver::kVmSaver( WId id ) : KScreenSaver( id )
+{
+ readSettings();
+
+ colorContext = QColor::enterAllocContext();
+
+ blank();
+ setSpeed( speed );
+ setRefreshTimeout( refreshTimeout );
+
+ refreshStep = 0;
+
+ pool_state = init_pool( this );
+ vm_default_initstate( time(0), &(pool_state->pool->vm_random_data) );
+ connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) );
+ timer.start( 100 - speed );
+}
+
+kVmSaver::~kVmSaver()
+{
+ timer.stop();
+ vm_done_pool( pool_state->pool );
+ delete[] pool_state->modified;
+ QColor::leaveAllocContext();
+ QColor::destroyAllocContext( colorContext );
+}
+
+void kVmSaver::blank()
+{
+ setBackgroundColor( black );
+ erase();
+}
+
+void kVmSaver::setSpeed( int spd )
+{
+ speed = spd;
+// timer.changeInterval( (100 - speed)*(100 - speed)*(100 - speed)/10000 );
+ timer.changeInterval( (100 - speed) );
+}
+void kVmSaver::setRefreshTimeout( const int refreshTimeout )
+{
+ this->refreshTimeout = refreshTimeout;
+}
+
+void kVmSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ speed = config->readNumEntry( "Speed", 50 );
+ refreshTimeout = config->readNumEntry( "DisplayRefreshTimeout", 0 );
+}
+int kVmSaver::getRandom( const int max_value ) {
+ return (int)( vm_random(&(pool_state->pool->vm_random_data))*1.0*(max_value + 1.0)/
+ (VM_RAND_MAX + 1.0) );
+// return (int)( rand()*1.0*(max_value + 1.0)/
+// (RAND_MAX + 1.0) );
+}
+void kVmSaver::modifyArea( const int op ) {
+ int position;
+
+ vm_modify( pool_state->pool, position =
+ getRandom(pool_state->pool->area_size - 1), op );
+ pool_state->modified[position] = 1;
+}
+
+void kVmSaver::slotTimeout()
+{
+ for( int i = 0; i < 1; ++i ) {
+ if( getRandom(2) == 0 )
+ modifyArea( VM_OP_PUSH + getRandom(11) - getRandom(11) );
+ if( getRandom(8) == 0 )
+ modifyArea( VM_OP_STOP );
+ if( getRandom(8) == 0 )
+ modifyArea( VM_OP_COPY );
+ if( getRandom(8) == 0 )
+ modifyArea( VM_OP_EXEC );
+// if( getRandom(5) == 0 )
+// modifyArea( VM_OP_WAIT );
+ }
+ if( getRandom(0) == 0 )
+ vm_exec( pool_state->pool, getRandom(pool_state->pool->area_size - 1), 0,
+ vm_get_reverse( pool_state->pool ) );
+ vm_iterate( pool_state->pool, pool_state->modified );
+// if( refreshStep++ >= refreshTimeout*refreshTimeout*refreshTimeout ) {
+ if( refreshStep++ >= refreshTimeout ) {
+ draw_pool( pool_state );
+ refreshStep = 0;
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+kVmSetup::kVmSetup( QWidget *parent, const char *name )
+ : KDialogBase( parent, name, true, i18n( "Setup Virtual Machine" ),
+ Ok|Cancel|Help, Ok, true )
+{
+ readSettings();
+
+ setButtonText( Help, i18n( "A&bout" ) );
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout *tl = new QHBoxLayout( main, 0, spacingHint() );
+ QVBoxLayout *tl1 = new QVBoxLayout();
+ tl->addLayout(tl1);
+
+ QLabel *label = new QLabel( i18n("Virtual machine speed:"), main );
+ tl1->addWidget(label);
+
+ QSlider *slider = new QSlider( QSlider::Horizontal, main );
+ slider->setMinimumSize( 120, 20 );
+ slider->setRange( 0, 100 );
+ slider->setSteps( 10, 20 );
+ slider->setTickmarks( QSlider::Below );
+ slider->setTickInterval( 10 );
+ slider->setValue( speed );
+ connect( slider, SIGNAL( valueChanged( int ) ),
+ SLOT( slotSpeed( int ) ) );
+ tl1->addWidget(slider);
+
+ label = new QLabel( i18n("Display update speed:"), main );
+ tl1->addWidget(label);
+
+ slider = new QSlider( QSlider::Horizontal, main );
+ slider->setMinimumSize( 120, 20 );
+ slider->setRange( 0, MAX_REFRESH_TIMEOUT );
+ slider->setSteps( MAX_REFRESH_TIMEOUT/10, MAX_REFRESH_TIMEOUT/5 );
+ slider->setTickmarks( QSlider::Below );
+ slider->setTickInterval( MAX_REFRESH_TIMEOUT/10 );
+ slider->setValue( MAX_REFRESH_TIMEOUT - refreshTimeout );
+ connect( slider, SIGNAL( valueChanged( int ) ),
+ SLOT( slotRefreshTimeout( int ) ) );
+ tl1->addWidget(slider);
+ tl1->addStretch();
+
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 165 );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new kVmSaver( preview->winId() );
+ tl->addWidget(preview);
+}
+
+kVmSetup::~kVmSetup()
+{
+ delete saver;
+}
+
+void kVmSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ speed = config->readNumEntry( "Speed", 50 );
+ if ( speed > 100 )
+ speed = 100;
+ else if ( speed < 0 )
+ speed = 0;
+ refreshTimeout = config->readNumEntry( "DisplayRefreshTimeout", 0 );
+ if ( refreshTimeout > MAX_REFRESH_TIMEOUT )
+ refreshTimeout = MAX_REFRESH_TIMEOUT;
+ else if ( refreshTimeout < 0 )
+ refreshTimeout = 0;
+}
+
+void kVmSetup::slotSpeed( int num )
+{
+ speed = num;
+ if ( saver )
+ saver->setSpeed( num );
+}
+void kVmSetup::slotRefreshTimeout( int num )
+{
+ refreshTimeout = MAX_REFRESH_TIMEOUT - num;
+ if ( saver )
+ saver->setRefreshTimeout( refreshTimeout );
+}
+
+void kVmSetup::slotOk()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ QString sspeed;
+ sspeed.setNum( speed );
+ config->writeEntry( "Speed", sspeed );
+ sspeed.setNum( refreshTimeout );
+ config->writeEntry( "DisplayRefreshTimeout", sspeed );
+
+ config->sync();
+ accept();
+}
+
+void kVmSetup::slotHelp()
+{
+ KMessageBox::about(this,
+ i18n("Virtual Machine Version 0.1\n\nCopyright (c) 2000 Artur Rataj <art@zeus.polsl.gliwice.pl>\n"),
+ i18n("About Virtual Machine")
+ );
+}
+
+#include "kvm.moc"
+
diff --git a/kscreensaver/kdesavers/kvm.h b/kscreensaver/kdesavers/kvm.h
new file mode 100644
index 00000000..44c7eeb3
--- /dev/null
+++ b/kscreensaver/kdesavers/kvm.h
@@ -0,0 +1,99 @@
+//-----------------------------------------------------------------------------
+//
+// kvm screensaver
+//
+
+#ifndef __KVM_H__
+#define __KVM_H__
+
+#include <qtimer.h>
+#include <qptrlist.h>
+
+#include <kdialogbase.h>
+#include <kscreensaver.h>
+
+extern "C" {
+#include "vm.h"
+#include "vm_random.h"
+}
+
+#define THREAD_MAX_STACK_SIZE 10
+#define MAX_THREADS_NUM 20
+
+#define MAX_REFRESH_TIMEOUT 40
+
+typedef struct {
+ QWidget *w;
+ int grid_width, grid_height;
+ int grid_margin_x;
+ int grid_margin_y;
+ int char_width, char_height;
+ bool insert_top_p, insert_bottom_p;
+ int density;
+ struct tvm_pool* pool;
+ char* modified;
+ int show_threads;
+
+ QPixmap images;
+ int image_width, image_height;
+ int nglyphs;
+
+} m_state;
+
+
+class kVmSaver : public KScreenSaver
+{
+ Q_OBJECT
+public:
+ kVmSaver( WId id );
+ virtual ~kVmSaver();
+
+ void setSpeed( int spd );
+ void setRefreshTimeout( const int refreshTimeout );
+
+protected:
+ void blank();
+ void readSettings();
+ int getRandom( const int max_value );
+ void modifyArea( const int op );
+
+protected slots:
+ void slotTimeout();
+
+protected:
+ QTimer timer;
+ int colorContext;
+
+ int speed;
+ m_state* pool_state;
+ int refreshStep;
+ int refreshTimeout;
+};
+
+
+class kVmSetup : public KDialogBase
+{
+ Q_OBJECT
+public:
+ kVmSetup( QWidget *parent = NULL, const char *name = NULL );
+ ~kVmSetup();
+protected:
+ void readSettings();
+
+private slots:
+ void slotSpeed( int );
+ void slotRefreshTimeout( int num );
+ void slotOk();
+ void slotHelp();
+
+private:
+ QWidget *preview;
+ kVmSaver *saver;
+
+ int speed;
+ int refreshTimeout;
+};
+
+
+#endif
+
diff --git a/kscreensaver/kdesavers/lines.cpp b/kscreensaver/kdesavers/lines.cpp
new file mode 100644
index 00000000..fbe31056
--- /dev/null
+++ b/kscreensaver/kdesavers/lines.cpp
@@ -0,0 +1,401 @@
+//-----------------------------------------------------------------------------
+//
+// klines 0.1.1 - Basic screen saver for KDE
+// by Dirk Staneker 1997
+// based on kpolygon from Martin R. Jones 1996
+// mailto:dirk.staneker@student.uni-tuebingen.de
+//
+// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org>
+// 2001/03/04 Converted to libkscreensaver by Martin R. Jones
+
+#include <config.h>
+#include <stdlib.h>
+#include <time.h>
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qslider.h>
+#include <kconfig.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <kcolorbutton.h>
+
+#include "kcolordialog.h"
+#include "lines.h"
+#include "lines.moc"
+
+#include <qlayout.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <qpainter.h>
+
+#define MAXLENGTH 256
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "klines.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "KLines" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new kLinesSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new kLinesSetup();
+ }
+}
+
+// Methods of the Lines-class
+Lines::Lines(int x){
+ uint i;
+ numLn=x;
+ offx1=12;
+ offy1=16;
+ offx2=9;
+ offy2=10;
+ start=new Ln;
+ end=start;
+ for(i=1; i<numLn; i++){
+ end->next=new Ln;
+ end=end->next;
+ }
+ end->next=start;
+ akt=start;
+}
+
+Lines::~Lines(){
+ uint i;
+ for(i=0; i<numLn; i++){
+ end=start->next;
+ delete start;
+ start=end;
+ }
+}
+
+inline void Lines::reset(){ akt=start; }
+
+inline void Lines::getKoord(int& a, int& b, int& c, int& d){
+ a=akt->x1; b=akt->y1;
+ c=akt->x2; d=akt->y2;
+ akt=akt->next;
+}
+
+inline void Lines::setKoord(const int& a, const int& b, const int& c, const int& d){
+ akt->x1=a; akt->y1=b;
+ akt->x2=c; akt->y2=d;
+}
+
+inline void Lines::next(void){ akt=akt->next; }
+
+void Lines::turn(const int& w, const int& h){
+ start->x1=end->x1+offx1;
+ start->y1=end->y1+offy1;
+ start->x2=end->x2+offx2;
+ start->y2=end->y2+offy2;
+ if(start->x1>=w) offx1=-8;
+ if(start->x1<=0) offx1=7;
+ if(start->y1>=h) offy1=-11;
+ if(start->y1<=0) offy1=13;
+ if(start->x2>=w) offx2=-17;
+ if(start->x2<=0) offx2=15;
+ if(start->y2>=h) offy2=-10;
+ if(start->y2<=0) offy2=13;
+ end->next=start;
+ start=start->next;
+ end=end->next;
+}
+
+
+//-----------------------------------------------------------------------------
+// dialog to setup screen saver parameters
+//
+kLinesSetup::kLinesSetup(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n( "Setup Lines Screen Saver" ),
+ Ok|Cancel|Help, Ok, true ), saver( 0 ), length( 10 ), speed( 50 )
+{
+ readSettings();
+
+ setButtonText( Help, i18n( "A&bout" ) );
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout *tl = new QHBoxLayout(main, 0, spacingHint());
+ QVBoxLayout *tl1 = new QVBoxLayout;
+ tl->addLayout(tl1);
+
+ QLabel *label=new QLabel(i18n("Length:"), main);
+ tl1->addWidget(label);
+
+ QSlider *sb= new QSlider(1, MAXLENGTH+1, 16, length, QSlider::Horizontal,
+ main);
+ sb->setMinimumSize(120, 20);
+ sb->setTickmarks(QSlider::Below);
+ sb->setTickInterval(32);
+ connect(sb, SIGNAL(valueChanged(int)), SLOT(slotLength(int)));
+ tl1->addWidget(sb);
+
+ label=new QLabel(i18n("Speed:"), main);
+ tl1->addWidget(label);
+
+ sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, main);
+ sb->setMinimumSize(120, 20);
+ sb->setTickmarks(QSlider::Below);
+ sb->setTickInterval(10);
+ connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) );
+ tl1->addWidget(sb);
+
+ label=new QLabel(i18n("Beginning:"), main);
+ tl1->addWidget(label);
+
+ colorPush0=new KColorButton(colstart, main);
+ connect(colorPush0, SIGNAL(changed(const QColor &)),
+ SLOT(slotColstart(const QColor &)));
+ tl1->addWidget(colorPush0);
+
+ label=new QLabel(i18n("Middle:"), main);
+ tl1->addWidget(label);
+
+ colorPush1=new KColorButton(colmid, main);
+ connect(colorPush1, SIGNAL(changed(const QColor &)),
+ SLOT(slotColmid(const QColor &)));
+ tl1->addWidget(colorPush1);
+
+ label=new QLabel(i18n("End:"), main);
+ tl1->addWidget(label);
+
+ colorPush2=new KColorButton(colend, main);
+ connect(colorPush2, SIGNAL(changed(const QColor &)),
+ SLOT(slotColend(const QColor &)));
+ tl1->addWidget(colorPush2);
+ tl1->addStretch();
+
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver=new kLinesSaver(preview->winId());
+ tl->addWidget(preview);
+}
+
+kLinesSetup::~kLinesSetup()
+{
+ delete saver;
+}
+
+// read settings from config file
+void kLinesSetup::readSettings(){
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ QString str;
+
+ length = config->readNumEntry("Length", length);
+ if(length>MAXLENGTH) length=MAXLENGTH;
+ else if(length<1) length=1;
+
+ speed = config->readNumEntry("Speed", speed);
+ if(speed>100) speed=100;
+ else if(speed<50) speed=50;
+
+ str=config->readEntry("StartColor");
+ if(!str.isNull()) colstart.setNamedColor(str);
+ else colstart=white;
+ str=config->readEntry("MidColor");
+ if(!str.isNull()) colmid.setNamedColor(str);
+ else colmid=blue;
+ str=config->readEntry("EndColor");
+ if(!str.isNull()) colend.setNamedColor(str);
+ else colend=black;
+}
+
+void kLinesSetup::slotLength(int len){
+ length=len;
+ if(saver) saver->setLines(length);
+}
+
+void kLinesSetup::slotSpeed(int num){
+ speed=num;
+ if(saver) saver->setSpeed(speed);
+}
+
+void kLinesSetup::slotColstart(const QColor &col){
+ colstart = col;
+ if(saver) saver->setColor(colstart, colmid, colend);
+}
+
+void kLinesSetup::slotColmid(const QColor &col){
+ colmid = col;
+ if(saver) saver->setColor(colstart, colmid, colend);
+}
+
+void kLinesSetup::slotColend(const QColor &col){
+ colend = col;
+ if(saver) saver->setColor(colstart, colmid, colend);
+}
+
+void kLinesSetup::slotHelp(){
+ KMessageBox::about(this,
+ i18n("Lines Version 2.2.0\n\n"
+ "Written by Dirk Staneker 1997\n"
+ "dirk.stanerker@student.uni-tuebingen.de"));
+}
+
+// Ok pressed - save settings and exit
+void kLinesSetup::slotOk(){
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+
+ QString slength;
+ slength.setNum(length);
+ config->writeEntry("Length", slength);
+
+ QString sspeed;
+ sspeed.setNum( speed );
+ config->writeEntry( "Speed", sspeed );
+
+ QString colName0, colName1, colName2;
+ colName0.sprintf("#%02x%02x%02x", colstart.red(),
+ colstart.green(), colstart.blue() );
+ config->writeEntry( "StartColor", colName0 );
+
+ colName1.sprintf("#%02x%02x%02x", colmid.red(),
+ colmid.green(), colmid.blue() );
+ config->writeEntry( "MidColor", colName1 );
+
+ colName2.sprintf("#%02x%02x%02x", colend.red(),
+ colend.green(), colend.blue() );
+ config->writeEntry( "EndColor", colName2 );
+
+ config->sync();
+ accept();
+}
+
+//-----------------------------------------------------------------------------
+
+
+kLinesSaver::kLinesSaver( WId id ) : KScreenSaver( id ){
+ readSettings();
+ lines=new Lines(numLines);
+ colorContext=QColor::enterAllocContext();
+ blank();
+ initialiseColor();
+ initialiseLines();
+ timer.start(speed);
+ connect(&timer, SIGNAL(timeout()), SLOT(slotTimeout()));
+}
+
+kLinesSaver::~kLinesSaver(){
+ timer.stop();
+ QColor::leaveAllocContext();
+ QColor::destroyAllocContext(colorContext);
+ delete lines;
+}
+
+// set lines properties
+void kLinesSaver::setLines(int len){
+ timer.stop();
+ numLines=len;
+ initialiseLines();
+ initialiseColor();
+ blank();
+ timer.start(speed);
+}
+
+// set the speed
+void kLinesSaver::setSpeed(int spd){
+ timer.stop();
+ speed=100-spd;
+ timer.start(speed);
+}
+
+void kLinesSaver::setColor(const QColor& cs, const QColor& cm, const QColor& ce){
+ colstart=cs;
+ colmid=cm;
+ colend=ce;
+ initialiseColor();
+}
+
+// read configuration settings from config file
+void kLinesSaver::readSettings(){
+ KConfig *config=KGlobal::config();
+ config->setGroup("Settings");
+
+ numLines=config->readNumEntry("Length", 10);
+ speed = 100- config->readNumEntry("Speed", 50);
+ if(numLines>MAXLENGTH) numLines=MAXLENGTH;
+ else if(numLines<1) numLines = 1;
+
+ colstart=config->readColorEntry("StartColor", &white);
+ colmid=config->readColorEntry("MidColor", &blue);
+ colend=config->readColorEntry("EndColor", &black);
+}
+
+// draw next lines and erase tail
+void kLinesSaver::slotTimeout(){
+ uint i;
+ int x1,y1,x2,y2;
+ int col=0;
+
+ lines->reset();
+ QPainter p( this );
+ p.setPen( black );
+
+ for(i=0; i<numLines; i++){
+ lines->getKoord(x1,y1,x2,y2);
+ p.drawLine( x1, y1, x2, y2 );
+ p.setPen( colors[col] );
+ col=(int)(i*colscale);
+ if(col>63) col=0;
+ }
+ lines->turn(width(), height());
+}
+
+void kLinesSaver::blank(){
+ setBackgroundColor( black );
+ erase();
+}
+
+// initialise the lines
+void kLinesSaver::initialiseLines(){
+ uint i;
+ int x1,y1,x2,y2;
+ delete lines;
+ lines=new Lines(numLines);
+ lines->reset();
+ x1=rnd.getLong(width());
+ y1=rnd.getLong(height());
+ x2=rnd.getLong(width());
+ y2=rnd.getLong(height());
+ for(i=0; i<numLines; i++){
+ lines->setKoord(x1,y1,x2,y2);
+ lines->next();
+ }
+}
+
+// create a color table of 64 colors
+void kLinesSaver::initialiseColor(){
+ int i;
+ double mr, mg, mb;
+ double cr, cg, cb;
+ mr=(double)(colmid.red()-colstart.red())/32;
+ mg=(double)(colmid.green()-colstart.green())/32;
+ mb=(double)(colmid.blue()-colstart.blue())/32;
+ cr=colstart.red();
+ cg=colstart.green();
+ cb=colstart.blue();
+ for(i=0; i<32; i++){
+ colors[63-i].setRgb((int)(mr*i+cr), (int)(mg*i+cg), (int)(mb*i+cb));
+ }
+ mr=(double)(colend.red()-colmid.red())/32;
+ mg=(double)(colend.green()-colmid.green())/32;
+ mb=(double)(colend.blue()-colmid.blue())/32;
+ cr=colmid.red();
+ cg=colmid.green();
+ cb=colmid.blue();
+ for(i=0; i<32; i++){
+ colors[31-1].setRgb((int)(mr*i+cr), (int)(mg*i+cg), (int)(mb*i+cb));
+ }
+ colscale=64.0/(double)numLines;
+}
diff --git a/kscreensaver/kdesavers/lines.h b/kscreensaver/kdesavers/lines.h
new file mode 100644
index 00000000..d3f1062c
--- /dev/null
+++ b/kscreensaver/kdesavers/lines.h
@@ -0,0 +1,96 @@
+//-----------------------------------------------------------------------------
+//
+// klines 0.1.1 - Basic screen saver for KDE
+// by Dirk Staneker 1997
+// based on kpolygon 0.3 by Martin R. Jones 1996
+//
+
+#ifndef __LINES_H__
+#define __LINES_H__
+
+#include <qtimer.h>
+#include <qptrlist.h>
+
+#include <kdialogbase.h>
+#include <krandomsequence.h>
+#include <kscreensaver.h>
+
+class KColorButton;
+
+class Lines{
+ private:
+ struct Ln{
+ Ln* next;
+ int x1, y1, x2, y2;
+ };
+ Ln *start, *end, *akt;
+ int offx1, offy1, offx2, offy2;
+ uint numLn;
+ public:
+ Lines(int);
+ ~Lines();
+ inline void reset();
+ inline void getKoord(int&, int&, int&, int&);
+ inline void setKoord(const int&, const int&, const int&, const int&);
+ inline void next(void);
+ void turn(const int&, const int&);
+};
+
+class kLinesSaver:public KScreenSaver{
+ Q_OBJECT
+ public:
+ kLinesSaver( WId id );
+ virtual ~kLinesSaver();
+
+ void setLines(int len);
+ void setSpeed(int spd);
+ void setColor(const QColor&, const QColor&, const QColor&);
+
+ private:
+ void readSettings();
+ void blank();
+ void initialiseLines();
+ void initialiseColor();
+
+ protected slots:
+ void slotTimeout();
+
+ protected:
+ KRandomSequence rnd;
+ QTimer timer;
+ unsigned numLines;
+ int colorContext, speed;
+ QColor colors[64];
+ QColor colstart, colmid, colend;
+ double colscale;
+ Lines* lines;
+};
+
+class kLinesSetup : public KDialogBase{
+ Q_OBJECT
+ public:
+ kLinesSetup(QWidget *parent=NULL, const char *name=NULL);
+ ~kLinesSetup();
+
+ protected:
+ void readSettings();
+
+ private slots:
+ void slotLength(int);
+ void slotSpeed(int);
+ void slotColstart(const QColor &);
+ void slotColmid(const QColor &);
+ void slotColend(const QColor &);
+ void slotOk();
+ void slotHelp();
+
+ private:
+ KColorButton *colorPush0, *colorPush1, *colorPush2;
+ QWidget *preview;
+ kLinesSaver *saver;
+ int length, speed;
+ QColor colstart, colmid, colend;
+};
+
+#endif
+
diff --git a/kscreensaver/kdesavers/lorenz.cpp b/kscreensaver/kdesavers/lorenz.cpp
new file mode 100644
index 00000000..c9017bb0
--- /dev/null
+++ b/kscreensaver/kdesavers/lorenz.cpp
@@ -0,0 +1,569 @@
+//-----------------------------------------------------------------------------
+//
+// Lorenz - Lorenz Attractor screen saver
+// Nicolas Brodu, brodu@kde.org, 2000
+//
+// Portions of code from kblankscrn and khop.
+// See authors there.
+//
+// I release my code as GPL, but see the other headers and the README
+
+#include <math.h>
+#include <stdlib.h>
+
+#include <qpainter.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <qcolor.h>
+#include <qlabel.h>
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+
+#include "lorenz.h"
+#include "lorenz.moc"
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "klorenz.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "KLorenz" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KLorenzSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KLorenzSetup();
+ }
+}
+
+#define MINSPEED 1
+#define MAXSPEED 1500
+#define DEFSPEED 150
+#define MINZROT -180
+#define MAXZROT 180
+#define DEFZROT 104 //100
+#define MINYROT -180
+#define MAXYROT 180
+#define DEFYROT -19 //80
+#define MINXROT -180
+#define MAXXROT 180
+#define DEFXROT 25 //20
+#define MINEPOCH 1
+#define MAXEPOCH 30000
+#define DEFEPOCH 5800
+#define MINCOLOR 1
+#define MAXCOLOR 100
+#define DEFCOLOR 20
+
+//-----------------------------------------------------------------------------
+// dialog to setup screen saver parameters
+//
+KLorenzSetup::KLorenzSetup( QWidget *parent, const char *name )
+ : KDialogBase( parent, name, true, i18n( "Setup Lorenz Attractor" ),
+ Ok|Cancel|Default|Help, Ok, true )
+{
+ readSettings();
+
+ setButtonText( Help, i18n( "A&bout" ) );
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout *tl = new QHBoxLayout( main, 0, spacingHint() );
+ QVBoxLayout *tl1 = new QVBoxLayout;
+ tl->addLayout(tl1);
+
+ QLabel *label = new QLabel( i18n("Speed:"), main );
+ tl1->addWidget(label);
+
+ sps = new QSlider(MINSPEED, MAXSPEED, 10, speed, QSlider::Horizontal, main);
+ sps->setMinimumSize( 120, 20 );
+ sps->setTickmarks(QSlider::Below);
+ sps->setTickInterval(150);
+ connect( sps, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) );
+ tl1->addWidget(sps);
+
+ label = new QLabel( i18n("Epoch:"), main );
+ tl1->addWidget(label);
+
+ eps = new QSlider(MINEPOCH, MAXEPOCH, 100, epoch, QSlider::Horizontal, main);
+ eps->setMinimumSize( 120, 20 );
+ eps->setTickmarks(QSlider::Below);
+ eps->setTickInterval(3000);
+ connect( eps, SIGNAL( valueChanged( int ) ), SLOT( slotEpoch( int ) ) );
+ tl1->addWidget(eps);
+
+ label = new QLabel( i18n("Color rate:"), main );
+ tl1->addWidget(label);
+
+ crs = new QSlider(MINCOLOR, MAXCOLOR, 5, crate, QSlider::Horizontal, main);
+ crs->setMinimumSize( 120, 20 );
+ crs->setTickmarks(QSlider::Below);
+ crs->setTickInterval(10);
+ connect( crs, SIGNAL( valueChanged( int ) ), SLOT( slotCRate( int ) ) );
+ tl1->addWidget(crs);
+
+ label = new QLabel( i18n("Rotation Z:"), main );
+ tl1->addWidget(label);
+
+ zrs = new QSlider(MINZROT, MAXZROT, 18, zrot, QSlider::Horizontal, main);
+ zrs->setMinimumSize( 120, 20 );
+ zrs->setTickmarks(QSlider::Below);
+ zrs->setTickInterval(36);
+ connect( zrs, SIGNAL( valueChanged( int ) ), SLOT( slotZRot( int ) ) );
+ tl1->addWidget(zrs);
+
+ label = new QLabel( i18n("Rotation Y:"), main );
+ tl1->addWidget(label);
+
+ yrs = new QSlider(MINYROT, MAXYROT, 18, yrot, QSlider::Horizontal, main);
+ yrs->setMinimumSize( 120, 20 );
+ yrs->setTickmarks(QSlider::Below);
+ yrs->setTickInterval(36);
+ connect( yrs, SIGNAL( valueChanged( int ) ), SLOT( slotYRot( int ) ) );
+ tl1->addWidget(yrs);
+
+ label = new QLabel( i18n("Rotation X:"), main );
+ tl1->addWidget(label);
+
+ xrs = new QSlider(MINXROT, MAXXROT, 18, xrot, QSlider::Horizontal, main);
+ xrs->setMinimumSize( 120, 20 );
+ xrs->setTickmarks(QSlider::Below);
+ xrs->setTickInterval(36);
+ connect( xrs, SIGNAL( valueChanged( int ) ), SLOT( slotXRot( int ) ) );
+ tl1->addWidget(xrs);
+
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 165 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new KLorenzSaver( preview->winId() );
+ tl->addWidget(preview);
+}
+
+KLorenzSetup::~KLorenzSetup()
+{
+ delete saver;
+}
+
+// read settings from config file
+void KLorenzSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ speed = config->readNumEntry( "Speed", DEFSPEED );
+ epoch = config->readNumEntry( "Epoch", DEFEPOCH );
+ crate = config->readNumEntry( "Color Rate", DEFCOLOR );
+ zrot = config->readNumEntry( "ZRot", DEFZROT );
+ yrot = config->readNumEntry( "YRot", DEFZROT );
+ xrot = config->readNumEntry( "XRot", DEFZROT );
+}
+
+
+void KLorenzSetup::slotSpeed(int num)
+{
+ speed = num;
+ if (saver) saver->setSpeed(speed);
+}
+
+void KLorenzSetup::slotEpoch(int num)
+{
+ epoch = num;
+ if (saver) saver->setEpoch(epoch);
+}
+
+void KLorenzSetup::slotCRate(int num)
+{
+ crate = num;
+ if (saver) saver->setCRate(crate);
+}
+
+void KLorenzSetup::slotZRot(int num)
+{
+ zrot = num;
+ if (saver) {
+ saver->setZRot(zrot);
+ saver->updateMatrix();
+ saver->newEpoch();
+ }
+}
+
+void KLorenzSetup::slotYRot(int num)
+{
+ yrot = num;
+ if (saver) {
+ saver->setYRot(yrot);
+ saver->updateMatrix();
+ saver->newEpoch();
+ }
+}
+
+void KLorenzSetup::slotXRot(int num)
+{
+ xrot = num;
+ if (saver) {
+ saver->setXRot(xrot);
+ saver->updateMatrix();
+ saver->newEpoch();
+ }
+}
+
+void KLorenzSetup::slotHelp()
+{
+ KMessageBox::about(this,i18n("Lorenz Attractor screen saver for KDE\n\nCopyright (c) 2000 Nicolas Brodu"));
+}
+
+// Ok pressed - save settings and exit
+void KLorenzSetup::slotOk()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ config->writeEntry( "Speed", speed );
+ config->writeEntry( "Epoch", epoch );
+ config->writeEntry( "Color Rate", crate );
+ config->writeEntry( "ZRot", zrot );
+ config->writeEntry( "YRot", yrot );
+ config->writeEntry( "XRot", xrot );
+
+ config->sync();
+
+ accept();
+}
+
+void KLorenzSetup::slotDefault()
+{
+ speed = DEFSPEED;
+ epoch = DEFEPOCH;
+ crate = DEFCOLOR;
+ zrot = DEFZROT;
+ yrot = DEFYROT;
+ xrot = DEFXROT;
+ if (saver) {
+ saver->setSpeed(speed);
+ saver->setEpoch(epoch);
+ saver->setCRate(crate);
+ saver->setZRot(zrot);
+ saver->setYRot(yrot);
+ saver->setXRot(xrot);
+ saver->updateMatrix();
+ saver->newEpoch();
+ }
+ sps->setValue(speed);
+ eps->setValue(epoch);
+ crs->setValue(crate);
+ zrs->setValue(zrot);
+ yrs->setValue(yrot);
+ xrs->setValue(xrot);
+
+/* // User can cancel, or save defaults?
+
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ config->writeEntry( "Speed", speed );
+ config->writeEntry( "Epoch", epoch );
+ config->writeEntry( "Color Rate", crate );
+ config->writeEntry( "ZRot", zrot );
+ config->writeEntry( "YRot", yrot );
+ config->writeEntry( "XRot", xrot );
+
+ config->sync();
+*/
+}
+
+//-----------------------------------------------------------------------------
+
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+const double pi = M_PI;
+
+// Homogeneous coordinate transform matrix
+// I initially wrote it for a Java applet, it is inspired from a
+// Matrix class in the JDK.
+// Nicolas Brodu, 1998-2000
+class Matrix3D
+{
+ // All coefficients
+ double xx, xy, xz, xo;
+ double yx, yy, yz, yo;
+ double zx, zy, zz, zo;
+ // 0, 0, 0, 1 are implicit
+public:
+
+ void unit()
+ {
+ xx=1.0; xy=0.0; xz=0.0; xo=0.0;
+ yx=0.0; yy=1.0; yz=0.0; yo=0.0;
+ zx=0.0; zy=0.0; zz=1.0; zo=0.0;
+ }
+
+ Matrix3D ()
+ {
+ unit();
+ }
+
+ // Translation
+ void translate(double x, double y, double z)
+ {
+ xo += x;
+ yo += y;
+ zo += z;
+ }
+
+ // Rotation, in degrees, around the Y axis
+ void rotY(double theta)
+ {
+ theta *= pi / 180;
+ double ct = cos(theta);
+ double st = sin(theta);
+
+ double Nxx = xx * ct + zx * st;
+ double Nxy = xy * ct + zy * st;
+ double Nxz = xz * ct + zz * st;
+ double Nxo = xo * ct + zo * st;
+
+ double Nzx = zx * ct - xx * st;
+ double Nzy = zy * ct - xy * st;
+ double Nzz = zz * ct - xz * st;
+ double Nzo = zo * ct - xo * st;
+
+ xo = Nxo;
+ xx = Nxx;
+ xy = Nxy;
+ xz = Nxz;
+ zo = Nzo;
+ zx = Nzx;
+ zy = Nzy;
+ zz = Nzz;
+ }
+
+
+ // Rotation, in degrees, around the X axis
+ void rotX(double theta)
+ {
+ theta *= pi / 180;
+ double ct = cos(theta);
+ double st = sin(theta);
+
+ double Nyx = yx * ct + zx * st;
+ double Nyy = yy * ct + zy * st;
+ double Nyz = yz * ct + zz * st;
+ double Nyo = yo * ct + zo * st;
+
+ double Nzx = zx * ct - yx * st;
+ double Nzy = zy * ct - yy * st;
+ double Nzz = zz * ct - yz * st;
+ double Nzo = zo * ct - yo * st;
+
+ yo = Nyo;
+ yx = Nyx;
+ yy = Nyy;
+ yz = Nyz;
+ zo = Nzo;
+ zx = Nzx;
+ zy = Nzy;
+ zz = Nzz;
+ }
+
+
+ // Rotation, in degrees, around the Z axis
+ void rotZ(double theta)
+ {
+ theta *= pi / 180;
+ double ct = cos(theta);
+ double st = sin(theta);
+
+ double Nyx = yx * ct + xx * st;
+ double Nyy = yy * ct + xy * st;
+ double Nyz = yz * ct + xz * st;
+ double Nyo = yo * ct + xo * st;
+
+ double Nxx = xx * ct - yx * st;
+ double Nxy = xy * ct - yy * st;
+ double Nxz = xz * ct - yz * st;
+ double Nxo = xo * ct - yo * st;
+
+ yo = Nyo;
+ yx = Nyx;
+ yy = Nyy;
+ yz = Nyz;
+ xo = Nxo;
+ xx = Nxx;
+ xy = Nxy;
+ xz = Nxz;
+ }
+
+ // Multiply by a projection matrix, with camera f
+ // f 0 0 0 x f*x
+ // 0 f 0 0 * y = f*y
+ // 0 0 1 f z z+f
+ // 0 0 0 1 1 1
+ // So, it it easy to find the 2D coordinates after the transform
+ // u = f*x / (z+f)
+ // v = f*y / (z+f)
+ void proj(double f)
+ {
+ xx*=f;
+ xy*=f;
+ xz*=f;
+ xo*=f;
+ yx*=f;
+ yy*=f;
+ yz*=f;
+ yo*=f;
+ zo+=f;
+ }
+
+ // Apply the transformation 3D => 2D
+ void transform(double x, double y, double z, double &u, double& v, double& w)
+ {
+ u = x * xx + y * xy + z * xz + xo;
+ v = x * yx + y * yy + z * yz + yo;
+ w = x * zx + y * zy + z * zz + zo;
+ }
+};
+
+KLorenzSaver::KLorenzSaver( WId id ) : KScreenSaver( id )
+{
+ readSettings();
+
+ // Create a transform matrix with the parameters
+ mat = new Matrix3D();
+ updateMatrix();
+
+ colorContext = QColor::enterAllocContext();
+ setBackgroundColor( black );
+ newEpoch();
+
+ timer.start( 10 );
+ connect( &timer, SIGNAL( timeout() ), SLOT( drawOnce() ) );
+}
+
+KLorenzSaver::~KLorenzSaver()
+{
+ delete mat;
+ mat=0;
+ timer.stop();
+ QColor::leaveAllocContext();
+ QColor::destroyAllocContext( colorContext );
+}
+
+// read configuration settings from config file
+void KLorenzSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ speed = config->readNumEntry( "Speed", DEFSPEED );
+ epoch = config->readNumEntry( "Epoch", DEFEPOCH );
+ zrot = config->readNumEntry( "ZRot", DEFZROT );
+ yrot = config->readNumEntry( "YRot", DEFZROT );
+ xrot = config->readNumEntry( "XRot", DEFZROT );
+
+ int crate_num = config->readNumEntry( "Color Rate", DEFCOLOR );
+ crate = (double)crate_num / (double)MAXCOLOR;
+}
+
+void KLorenzSaver::setSpeed(int num)
+{
+ speed = num;
+}
+
+void KLorenzSaver::setEpoch(int num)
+{
+ epoch = num;
+}
+
+void KLorenzSaver::setZRot(int num)
+{
+ zrot = num;
+}
+
+void KLorenzSaver::setYRot(int num)
+{
+ yrot = num;
+}
+
+void KLorenzSaver::setXRot(int num)
+{
+ xrot = num;
+}
+
+void KLorenzSaver::setCRate(int num)
+{
+ crate = (double)num / (double)MAXCOLOR;
+}
+
+void KLorenzSaver::updateMatrix()
+{
+ // reset matrix
+ mat->unit();
+ // Remove the mean before the rotations...
+ mat->translate(-0.95413, -0.96740, -23.60065);
+ mat->rotZ(zrot);
+ mat->rotY(yrot);
+ mat->rotX(xrot);
+ mat->translate(0, 0, 100);
+ mat->proj(1);
+}
+
+void KLorenzSaver::newEpoch()
+{
+ // Start at a random position, somewhere around the mean
+ x = 0.95-25.0+50.0*kapp->random() / (RAND_MAX+1.0);
+ y = 0.97-25.0+50.0*kapp->random() / (RAND_MAX+1.0);
+ z = 23.6-25.0+50.0*kapp->random() / (RAND_MAX+1.0);
+ // start at some random 'time' as well to have different colors
+ t = 10000.0*kapp->random() / (RAND_MAX+1.0);
+ erase();
+ e=0; // reset epoch counter
+}
+
+// Computes the derivatives using Lorenz equations
+static void lorenz(double x, double y, double z, double& dx, double& dy, double& dz)
+{
+ dx = 10*(y-x);
+ dy = 28*x - y - x*z;
+ dz = x*y - z*8.0/3.0;
+}
+
+// Use a simple Runge-Kutta formula to draw a few points
+// No need to go beyond 2nd order for a screensaver!
+void KLorenzSaver::drawOnce()
+{
+ double kx, ky, kz, dx, dy, dz;
+ const double h = 0.0001;
+ const double tqh = h * 3.0 / 4.0;
+ QPainter p(this);
+
+ for (int i=0; i<speed; i++) {
+ // Runge-Kutta formula
+ lorenz(x,y,z,dx,dy,dz);
+ lorenz(x + tqh*dx, y + tqh*dy, z + tqh*dz, kx, ky, kz);
+ x += h*(dx/3.0+2*kx/3.0);
+ y += h*(dy/3.0+2*ky/3.0);
+ z += h*(dz/3.0+2*kz/3.0);
+ // Apply transform
+ mat->transform(x,y,z,kx,ky,kz);
+ // Choose a color
+ p.setPen(
+ QColor((int)(sin(t*crate/pi)*127+128),
+ (int)(sin(t*crate/(pi-1))*127+128),
+ (int)(sin(t*crate/(pi-2))*127+128)).pixel() );
+ // Draw a point
+ p.drawPoint( (int)(kx*width()*1.5/kz)+(int)(width()/2),
+ (int)(ky*height()*1.5/kz)+(int)(height()/2));
+ t+=h;
+ }
+ if (++e>=epoch) newEpoch();
+}
diff --git a/kscreensaver/kdesavers/lorenz.h b/kscreensaver/kdesavers/lorenz.h
new file mode 100644
index 00000000..f666db71
--- /dev/null
+++ b/kscreensaver/kdesavers/lorenz.h
@@ -0,0 +1,86 @@
+//-----------------------------------------------------------------------------
+//
+// Lorenz - Lorenz Attractor screen saver
+// Nicolas Brodu, brodu@kde.org, 2000
+//
+// Portions of code from kblankscrn and khop.
+// See authors there.
+//
+// I release my code as GPL, but see the other headers and the README
+
+#ifndef __LORENZKSCRN_H__
+#define __LORENZKSCRN_H__
+
+#include <qtimer.h>
+#include <qcolor.h>
+#include <kscreensaver.h>
+#include <kdialogbase.h>
+
+// See lorenz.cpp for this private class
+class Matrix3D;
+
+class KLorenzSaver : public KScreenSaver
+{
+ Q_OBJECT
+public:
+ KLorenzSaver( WId id );
+ virtual ~KLorenzSaver();
+ void setSpeed(int num);
+ void setEpoch(int num);
+ void setCRate(int num);
+ void setZRot(int num);
+ void setYRot(int num);
+ void setXRot(int num);
+ void updateMatrix();
+ void newEpoch();
+
+protected slots:
+ void drawOnce();
+
+protected:
+ QTimer timer;
+ int colorContext;
+
+private:
+ void readSettings();
+
+private:
+ double x, y, z, t;
+ double speed, epoch, zrot, yrot, xrot, crate;
+ int e;
+ Matrix3D *mat;
+};
+
+class QSlider;
+
+class KLorenzSetup : public KDialogBase
+{
+ Q_OBJECT
+public:
+ KLorenzSetup(QWidget *parent = 0, const char *name = 0 );
+ ~KLorenzSetup();
+
+protected:
+ void readSettings();
+
+private slots:
+ void slotSpeed(int num);
+ void slotEpoch(int num);
+ void slotCRate(int num);
+ void slotZRot(int num);
+ void slotYRot(int num);
+ void slotXRot(int num);
+
+ void slotOk();
+ void slotHelp();
+ void slotDefault();
+
+private:
+ QWidget *preview;
+ QSlider *sps, *eps, *zrs, *yrs, *xrs, *crs;
+ KLorenzSaver *saver;
+ int speed, epoch, zrot, yrot, xrot, crate;
+};
+
+#endif
+
diff --git a/kscreensaver/kdesavers/particle.png b/kscreensaver/kdesavers/particle.png
new file mode 100644
index 00000000..a777c822
--- /dev/null
+++ b/kscreensaver/kdesavers/particle.png
Binary files differ
diff --git a/kscreensaver/kdesavers/pendulum.cpp b/kscreensaver/kdesavers/pendulum.cpp
new file mode 100644
index 00000000..801b74dd
--- /dev/null
+++ b/kscreensaver/kdesavers/pendulum.cpp
@@ -0,0 +1,881 @@
+//============================================================================
+//
+// KPendulum screen saver for KDE
+//
+// The screen saver displays a physically realistic simulation of a two-part
+// pendulum.
+//
+// Developed by Georg Drenkhahn, georg-d@users.sourceforge.net
+//
+// $Id$
+//
+/*
+ * Copyright (C) 2004 Georg Drenkhahn
+ *
+ * KRotation is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation.
+ *
+ * KRotation is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02110-1301 USA
+ */
+//============================================================================
+
+// std. C++ headers
+#include <cstdlib>
+
+// Qt headers
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qvalidator.h>
+#include <qcolordialog.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+// KDE headers
+#include <klocale.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+
+#include "sspreviewarea.h"
+
+// pendulum.moc includes pendulum.h
+#include "pendulum.moc"
+
+#define KPENDULUM_VERSION "1.1"
+
+// libkscreensaver interface
+extern "C"
+{
+ /// application name for libkscreensaver interface
+ KDE_EXPORT const char *kss_applicationName = "kpendulum.kss";
+ /// application description for libkscreensaver interface
+ KDE_EXPORT const char *kss_description = I18N_NOOP("Simulation of\
+ a two-part pendulum");
+ /// application version for libkscreensaver interface
+ KDE_EXPORT const char *kss_version = KPENDULUM_VERSION;
+
+ /// function to create screen saver object
+ KDE_EXPORT KScreenSaver* kss_create(WId id)
+ {
+ return new KPendulumSaver(id);
+ }
+
+ /// function to create setup dialog for screen saver
+ KDE_EXPORT QDialog* kss_setup()
+ {
+ return new KPendulumSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// PendulumOdeSolver
+//-----------------------------------------------------------------------------
+
+PendulumOdeSolver::PendulumOdeSolver(
+ const double &_t,
+ const double &_dt,
+ std::valarray<double> &_y,
+ const double &_eps,
+ const double &_m1,
+ const double &_m2,
+ const double &_l1,
+ const double &_l2,
+ const double &_g)
+ : RkOdeSolver<double>(_t,_y,_dt,_eps),
+ A(1.0/(_m2*_l1*_l1)),
+ B1(_m2*_l1*_l2), // constants for faster numeric calculation
+ B(1.0/B1), // derived from m1,m2,l1,l2,g
+ C((_m1+_m2)/(_m2*_m2*_l2*_l2)),
+ D(_g*(_m1+_m2)*_l1),
+ E(_g*_m2*_l2),
+ M((_m1+_m2)/_m2)
+{
+}
+
+std::valarray<double> PendulumOdeSolver::f(
+ const double &x,
+ const std::valarray<double> &y) const
+{
+ (void)x; // unused
+
+ const double& q1 = y[0];
+ const double& q2 = y[1];
+ const double& p1 = y[2];
+ const double& p2 = y[3];
+
+ const double cosDq = std::cos(q1-q2);
+ const double iden = 1.0/(M - cosDq*cosDq); // invers denominator
+ const double dq1dt = (A*p1 - B*cosDq*p2)*iden;
+ const double dq2dt = (C*p2 - B*cosDq*p1)*iden;
+
+ std::valarray<double> ypr(y.size());
+ ypr[0] = dq1dt;
+ ypr[1] = dq2dt;
+
+ const double K = B1 * dq1dt*dq2dt * std::sin(q1-q2);
+ ypr[2] = -K - D * std::sin(q1);
+ ypr[3] = K - E * std::sin(q2);
+
+ return ypr;
+}
+
+//-----------------------------------------------------------------------------
+// Rotation: screen saver widget
+//-----------------------------------------------------------------------------
+
+PendulumGLWidget::PendulumGLWidget(QWidget* parent, const char* name)
+ : QGLWidget(parent, name),
+ eyeR(30), // eye coordinates (polar)
+ eyeTheta(M_PI*0.45),
+ eyePhi(0),
+ lightR(eyeR), // light coordinates (polar)
+ lightTheta(M_PI*0.25),
+ lightPhi(M_PI*0.25),
+ quadM1(gluNewQuadric()),
+ m_barColor(KPendulumSaver::barColorDefault),
+ m_m1Color(KPendulumSaver::m1ColorDefault),
+ m_m2Color(KPendulumSaver::m2ColorDefault)
+{
+}
+
+PendulumGLWidget::~PendulumGLWidget(void)
+{
+ gluDeleteQuadric(quadM1);
+}
+
+void PendulumGLWidget::setEyePhi(double phi)
+{
+ eyePhi = phi;
+ while (eyePhi < 0) eyePhi += 2.*M_PI;
+ while (eyePhi > 2*M_PI) eyePhi -= 2.*M_PI;
+
+ // get the view port
+ static GLint vp[4];
+ glGetIntegerv(GL_VIEWPORT, vp);
+ // calc new perspective, a resize event is simulated here
+ resizeGL(static_cast<int>(vp[2]), static_cast<int>(vp[3]));
+}
+
+void PendulumGLWidget::setAngles(const double& q1, const double& q2)
+{
+ ang1 = static_cast<GLfloat>(q1*180./M_PI);
+ ang2 = static_cast<GLfloat>(q2*180./M_PI);
+}
+
+void PendulumGLWidget::setMasses(const double& m1, const double& m2)
+{
+ sqrtm1 = static_cast<GLfloat>(sqrt(m1));
+ sqrtm2 = static_cast<GLfloat>(sqrt(m2));
+}
+
+void PendulumGLWidget::setLengths(const double& _l1, const double& _l2)
+{
+ l1 = static_cast<GLfloat>(_l1);
+ l2 = static_cast<GLfloat>(_l2);
+}
+
+void PendulumGLWidget::setBarColor(const QColor& c)
+{
+ if (c.isValid())
+ {
+ m_barColor = c;
+ }
+}
+
+void PendulumGLWidget::setM1Color(const QColor& c)
+{
+ if (c.isValid())
+ {
+ m_m1Color = c;
+ }
+}
+void PendulumGLWidget::setM2Color(const QColor& c)
+{
+ if (c.isValid())
+ {
+ m_m2Color = c;
+ }
+}
+
+/* --------- protected methods ----------- */
+
+void PendulumGLWidget::initializeGL(void)
+{
+ qglClearColor(QColor(black)); // set color to clear the background
+
+ glClearDepth(1); // depth buffer setup
+ glEnable(GL_DEPTH_TEST); // depth testing
+ glDepthFunc(GL_LEQUAL); // type of depth test
+
+ glShadeModel(GL_SMOOTH); // smooth color shading in poygons
+
+ // nice perspective calculation
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+
+ // set up the light
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+
+ glMatrixMode(GL_MODELVIEW); // select modelview matrix
+ glLoadIdentity();
+ // set positon of light0
+ GLfloat lightPos[4]=
+ {lightR * sin(lightTheta) * sin(lightPhi),
+ lightR * sin(lightTheta) * cos(lightPhi),
+ lightR * cos(lightTheta),
+ 0};
+ glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
+ // set positon of light1
+ lightPos[0] = lightR * sin(lightTheta) * sin(lightPhi+M_PI);
+ lightPos[1] = lightR * sin(lightTheta) * cos(lightPhi+M_PI);
+ glLightfv(GL_LIGHT1, GL_POSITION, lightPos);
+
+ // only for lights #>0
+ GLfloat spec[]={1,1,1,1};
+ glLightfv(GL_LIGHT1, GL_SPECULAR, spec);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, spec);
+
+ // enable setting the material colour by glColor()
+ glEnable(GL_COLOR_MATERIAL);
+
+ GLfloat emi[4] = {.13, .13, .13, 1};
+ glMaterialfv(GL_FRONT, GL_EMISSION, emi);
+}
+
+void PendulumGLWidget::paintGL(void)
+{
+ // clear color and depth buffer
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW); // select modelview matrix
+
+ glLoadIdentity();
+
+ static const GLfloat width = 2.0;
+ static const GLfloat masswidth = 1.0;
+ static const int noOfSlices = 20;
+
+ // top axis, left (x>0)
+ glTranslatef(0.5*width, 0, 0);
+ glRotatef(90, 0, 1, 0);
+ qglColor(m_barColor);
+ gluCylinder(quadM1, 0.2, 0.2, 5, 10, 1);
+ gluSphere(quadM1, 0.2, 10, 10);
+ // top axis, right
+ glLoadIdentity();
+ glTranslatef(-0.5*width, 0, 0);
+ glRotatef(-90, 0, 1, 0);
+ gluCylinder(quadM1, 0.2, 0.2, 5, 10, 1);
+ gluSphere(quadM1, 0.2, 10, 10);
+ // 1. part, left
+ glLoadIdentity();
+ glRotatef(ang1, 1, 0, 0);
+ glPushMatrix();
+ glTranslatef(0.5*width, 0, -l1);
+ gluCylinder(quadM1, 0.2, 0.2, l1, 10, 1);
+ glPopMatrix();
+
+ // 1. part, right
+ glPushMatrix();
+ glTranslatef(-0.5*width, 0, -l1);
+ gluCylinder(quadM1, 0.2, 0.2, l1, 10, 1);
+ // 1. part, bottom
+ glRotatef(90, 0, 1, 0);
+ gluSphere(quadM1, 0.2, 10, 10); // bottom corner 1
+ gluCylinder(quadM1, 0.2, 0.2, width, 10, 1); // connection
+ glTranslatef(0, 0, 0.5*(width-masswidth));
+ qglColor(m_m1Color);
+ gluCylinder(quadM1, sqrtm1, sqrtm1, masswidth, noOfSlices, 1); // mass 1
+ gluQuadricOrientation(quadM1, GLU_INSIDE);
+ gluDisk(quadM1, 0, sqrtm1, noOfSlices,1); // bottom of mass
+ gluQuadricOrientation(quadM1, GLU_OUTSIDE);
+ glTranslatef(0, 0, masswidth);
+ gluDisk(quadM1, 0, sqrtm1, noOfSlices,1); // top of mass
+
+ glTranslatef(0, 0, 0.5*(width-masswidth));
+ qglColor(m_barColor);
+ gluSphere(quadM1, 0.2, 10, 10); // bottom corner 2
+ glPopMatrix();
+
+ // 2. pendulum bar
+ glLoadIdentity();
+ glTranslatef(0, l1*std::sin(ang1*M_PI/180.), -l1*std::cos(ang1*M_PI/180.));
+ glRotatef(ang2, 1, 0, 0);
+ glTranslatef(0, 0, -l2);
+ qglColor(m_barColor);
+ gluCylinder(quadM1, 0.2, 0.2, l2, 10, 1);
+
+ // mass 2
+ glRotatef(90, 0, 1, 0);
+ glTranslatef(0, 0, -0.5*masswidth);
+ qglColor(m_m2Color);
+ gluCylinder(quadM1, sqrtm2, sqrtm2, masswidth, noOfSlices, 1);
+ gluQuadricOrientation(quadM1, GLU_INSIDE);
+ gluDisk(quadM1, 0, sqrtm2, noOfSlices,1); // bottom of mass
+ gluQuadricOrientation(quadM1, GLU_OUTSIDE);
+ glTranslatef(0, 0, masswidth);
+ gluDisk(quadM1, 0, sqrtm2, noOfSlices,1); // top of mass
+
+ glFlush();
+}
+
+void PendulumGLWidget::resizeGL(int w, int h)
+{
+ // Prevent a divide by zero
+ if (h == 0) h = 1;
+
+ // set the new view port
+ glViewport(0, 0, static_cast<GLint>(w), static_cast<GLint>(h));
+
+ // set up projection matrix
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ // Perspective view
+ gluPerspective(40.0f,
+ static_cast<GLdouble>(w)/static_cast<GLdouble>(h),
+ 1.0, 100.0f);
+
+ // Viewing transformation, position for better view
+ // Theta is polar angle 0<Theta<Pi
+ gluLookAt(
+ eyeR * sin(eyeTheta) * sin(eyePhi),
+ eyeR * sin(eyeTheta) * cos(eyePhi),
+ eyeR * cos(eyeTheta),
+ 0,0,0,
+ 0,0,1);
+}
+
+//-----------------------------------------------------------------------------
+// KPendulumSaver: screen saver class
+//-----------------------------------------------------------------------------
+
+KPendulumSaver::KPendulumSaver(WId id) :
+ KScreenSaver(id),
+ solver(0),
+ m_massRatio(massRatioDefault),
+ m_lengthRatio(lengthRatioDefault),
+ m_g(gDefault),
+ m_E(EDefault),
+ m_persChangeInterval(persChangeIntervalDefault)
+{
+ setEraseColor(black);
+ erase(); // erase area
+ glArea = new PendulumGLWidget(this); // create gl widget
+ glArea->setEyePhi(eyePhiDefault);
+
+ readSettings(); // read global settings into pars
+ initData(); // init solver and glArea with read settings
+
+ embed(glArea); // embed gl widget and resize it
+ glArea->show(); // show gl widget
+
+ // set up and start cyclic timer
+ timer = new QTimer(this);
+ timer->start(deltaT, TRUE);
+ connect(timer, SIGNAL(timeout()), this, SLOT(doTimeStep()));
+}
+
+KPendulumSaver::~KPendulumSaver()
+{
+ // time, rotation are automatically deleted with parent KPendulumSaver
+ delete solver;
+}
+
+
+void KPendulumSaver::readSettings()
+{
+ // read configuration settings from config file
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+
+ // internal saver parameters are set to stored values or left at their
+ // default values if stored values are out of range
+ setMassRatio(
+ config->readDoubleNumEntry(
+ "mass ratio",
+ KPendulumSaver::massRatioDefault));
+ setLengthRatio(
+ config->readDoubleNumEntry(
+ "length ratio",
+ KPendulumSaver::lengthRatioDefault));
+ setG(
+ config->readDoubleNumEntry(
+ "g",
+ KPendulumSaver::gDefault));
+ setE(
+ config->readDoubleNumEntry(
+ "E",
+ KPendulumSaver::EDefault));
+ setPersChangeInterval(
+ config->readUnsignedNumEntry(
+ "perspective change interval",
+ KPendulumSaver::persChangeIntervalDefault));
+
+ // set the colours
+ setBarColor(config->readColorEntry("bar color", &barColorDefault));
+ setM1Color( config->readColorEntry("m1 color", &m1ColorDefault));
+ setM2Color( config->readColorEntry("m2 color", &m2ColorDefault));
+}
+
+void KPendulumSaver::initData()
+{
+ const double m1plusm2 = 2; // m1+m2
+ const double m2 = m_massRatio * m1plusm2;
+ const double m1 = m1plusm2 - m2;
+ glArea->setMasses(m1, m2);
+ glArea->setAngles(0, 0);
+
+ const double l1plusl2 = 9; // l1+l2
+ const double l2 = m_lengthRatio * l1plusl2;
+ const double l1 = l1plusl2 - l2;
+ glArea->setLengths(l1, l2);
+
+ // kinetic energy of m2 and m1
+ const double kin_energy = m_E * m_g * (l1*m1 + (m1+m2)*(l1+l2));
+ // angular velocity for 1. and 2. pendulum
+ const double qp = sqrt(2.*kin_energy/((m1+m2)*l1*l1 + m2*l2*l2 + m2*l1*l2));
+
+ // assemble initial y for solver
+ std::valarray<double> y(4);
+ y[0] = 0; // q1
+ y[1] = 0; // q2
+ y[2] = (m1+m2)*l1*l1*qp + 0.5*m2*l1*l2*qp; // p1
+ y[3] = m2*l2*l2*qp + 0.5*m2*l1*l2*qp; // p2
+
+ // delete old solver
+ if (solver!=0) delete solver;
+ // init new solver
+ solver = new PendulumOdeSolver(
+ 0.0, // t
+ 0.01, // first dt step size estimation
+ y,
+ 1e-5, // eps
+ m1,
+ m2,
+ l1,
+ l2,
+ m_g);
+}
+
+
+void KPendulumSaver::setBarColor(const QColor& c)
+{
+ glArea->setBarColor(c);
+}
+QColor KPendulumSaver::barColor(void) const
+{
+ return glArea->barColor();
+}
+
+const QColor KPendulumSaver::barColorDefault(255, 255, 127);
+
+void KPendulumSaver::setM1Color(const QColor& c)
+{
+ glArea->setM1Color(c);
+}
+QColor KPendulumSaver::m1Color(void) const
+{
+ return glArea->m1Color();
+}
+
+const QColor KPendulumSaver::m1ColorDefault(170, 0, 127);
+
+void KPendulumSaver::setM2Color(const QColor& c)
+{
+ glArea->setM2Color(c);
+}
+QColor KPendulumSaver::m2Color(void) const
+{
+ return glArea->m2Color();
+}
+
+const QColor KPendulumSaver::m2ColorDefault( 85, 170, 127);
+
+
+void KPendulumSaver::setMassRatio(const double& massRatio)
+{
+ // range check is not neccessary in normal operation because validators check
+ // the values at input. But the validators do not check for corrupted
+ // settings read from disk.
+ if (massRatio >= massRatioLimitLower
+ && massRatio <= massRatioLimitUpper
+ && m_massRatio != massRatio)
+ {
+ m_massRatio = massRatio;
+ if (timer!=0)
+ {
+ initData();
+ }
+ }
+}
+
+const double KPendulumSaver::massRatioLimitLower = 0.01;
+const double KPendulumSaver::massRatioLimitUpper = 0.99;
+const double KPendulumSaver::massRatioDefault = 0.5;
+
+void KPendulumSaver::setLengthRatio(const double& lengthRatio)
+{
+ if (lengthRatio >= lengthRatioLimitLower
+ && lengthRatio <= lengthRatioLimitUpper
+ && m_lengthRatio != lengthRatio)
+ {
+ m_lengthRatio = lengthRatio;
+ if (timer!=0)
+ {
+ initData();
+ }
+ }
+}
+
+const double KPendulumSaver::lengthRatioLimitLower = 0.01;
+const double KPendulumSaver::lengthRatioLimitUpper = 0.99;
+const double KPendulumSaver::lengthRatioDefault = 0.5;
+
+void KPendulumSaver::setG(const double& g)
+{
+ if (g >= gLimitLower
+ && g <= gLimitUpper
+ && m_g != g)
+ {
+ m_g = g;
+ if (timer!=0)
+ {
+ initData();
+ }
+ }
+}
+
+const double KPendulumSaver::gLimitLower = 0.1;
+const double KPendulumSaver::gLimitUpper = 300.0;
+const double KPendulumSaver::gDefault = 40.0;
+
+void KPendulumSaver::setE(const double& E)
+{
+ if (E >= ELimitLower
+ && E <= ELimitUpper
+ && m_E != E)
+ {
+ m_E = E;
+ if (timer!=0)
+ {
+ initData();
+ }
+ }
+}
+
+const double KPendulumSaver::ELimitLower = 0.0;
+const double KPendulumSaver::ELimitUpper = 5.0;
+const double KPendulumSaver::EDefault = 1.2;
+
+void KPendulumSaver::setPersChangeInterval(
+ const unsigned int& persChangeInterval)
+{
+ if (persChangeInterval >= persChangeIntervalLimitLower
+ && persChangeInterval <= persChangeIntervalLimitUpper
+ && m_persChangeInterval != persChangeInterval)
+ {
+ m_persChangeInterval = persChangeInterval;
+ // do not restart simulation here
+ }
+}
+
+const double KPendulumSaver::eyePhiDefault = 0.25*M_PI;
+
+
+void KPendulumSaver::doTimeStep()
+{
+ /* time (in seconds) of perspective change.
+ * - t<0: no change yet
+ * - t=0: change starts
+ * - 0<t<moving time: change takes place
+ * - t=moving time: end of the change */
+ static double persChangeTime = -5;
+
+ // integrate a step ahead
+ solver->integrate(0.001*deltaT);
+
+ // read new y from solver
+ const std::valarray<double> y = solver->Y();
+
+ // tell glArea the new coordinates/angles of the pendulum
+ glArea->setAngles(y[0], y[1]);
+
+ // handle perspective change
+ persChangeTime += 0.001*deltaT;
+ if (persChangeTime > 0)
+ {
+ // phi value at the start of a perspective change
+ static double eyePhi0 = eyePhiDefault;
+ // phi value at the end of a perspective change
+ static double eyePhi1 = 0.75*M_PI;
+ static double deltaEyePhi = eyePhi1-eyePhi0;
+
+ // movement acceleration/deceleration
+ const double a = 3;
+ // duration of the change period
+ const double movingTime = 2.*sqrt(fabs(deltaEyePhi)/a);
+
+ // new current phi of eye
+ double eyePhi = persChangeTime < 0.5*movingTime ?
+ // accelerating phase
+ eyePhi0 + (deltaEyePhi>0?1:-1)
+ * 0.5*a*persChangeTime*persChangeTime:
+ // decellerating phase
+ eyePhi1 - (deltaEyePhi>0?1:-1)
+ * 0.5*a*(movingTime-persChangeTime)*(movingTime-persChangeTime);
+
+ if (persChangeTime>movingTime)
+ { // perspective change has finished
+ // set new time till next change
+ persChangeTime = -double(m_persChangeInterval);
+ eyePhi0 = eyePhi = eyePhi1;
+ // find new phi value with angleLimit < phi < Pi-angleLimit or
+ // Pi+angleLimit < phi < 2*Pi-angleLimit
+ const double angleLimit = M_PI*0.2;
+ for (eyePhi1 = 0;
+ eyePhi1<angleLimit
+ || (eyePhi1<M_PI+angleLimit && eyePhi1>M_PI-angleLimit)
+ || eyePhi1>2*M_PI-angleLimit;
+ eyePhi1 = double(rand())/RAND_MAX * 2*M_PI)
+ {}
+ // new delta phi for next change
+ deltaEyePhi = eyePhi1 - eyePhi0;
+ // find shortest perspective change
+ if (deltaEyePhi < -M_PI) deltaEyePhi += 2*M_PI;
+ }
+
+ glArea->setEyePhi(eyePhi); // set new perspective
+ }
+
+ glArea->updateGL(); // repaint scenery
+ timer->start(deltaT, TRUE); // restart timer
+}
+
+// public slot of KPendulumSaver, forward resize event to public slot of glArea
+// to allow the resizing of the gl area withing the setup dialog
+void KPendulumSaver::resizeGlArea(QResizeEvent* e)
+{
+ glArea->resize(e->size());
+}
+
+//-----------------------------------------------------------------------------
+// KPendulumSetup: dialog to setup screen saver parameters
+//-----------------------------------------------------------------------------
+
+KPendulumSetup::KPendulumSetup(QWidget* parent, const char* name)
+ : KPendulumSetupUi(parent, name),
+ // create saver and give it the WinID of the preview area
+ saver(new KPendulumSaver(preview->winId()))
+{
+ // the dialog should block, no other control center input should be possible
+ // until the dialog is closed
+ setModal(TRUE);
+
+ // create input validators
+ mEdit->setValidator(new QDoubleValidator(
+ KPendulumSaver::massRatioLimitLower,
+ KPendulumSaver::massRatioLimitUpper,
+ 5, mEdit));
+ lEdit->setValidator(new QDoubleValidator(
+ KPendulumSaver::lengthRatioLimitLower,
+ KPendulumSaver::lengthRatioLimitUpper,
+ 5, lEdit));
+ gEdit->setValidator(new QDoubleValidator(
+ KPendulumSaver::gLimitLower,
+ KPendulumSaver::gLimitUpper,
+ 5, gEdit));
+ eEdit->setValidator(new QDoubleValidator(
+ KPendulumSaver::ELimitLower,
+ KPendulumSaver::ELimitUpper,
+ 5, eEdit));
+
+ // set input limits for the perspective change interval time
+ persSpinBox->setMinValue(KPendulumSaver::persChangeIntervalLimitLower);
+ persSpinBox->setMaxValue(KPendulumSaver::persChangeIntervalLimitUpper);
+
+ // set tool tips of editable fields
+ QToolTip::add(
+ mEdit,
+ i18n("Ratio of 2nd mass to sum of both masses.\nValid values from %1 to %2.")
+ .arg(KPendulumSaver::massRatioLimitLower, 0, 'f', 2)
+ .arg(KPendulumSaver::massRatioLimitUpper, 0, 'f', 2));
+ QToolTip::add(
+ lEdit,
+ i18n("Ratio of 2nd pendulum part length to the sum of both part lengths.\nValid values from %1 to %2.")
+ .arg(KPendulumSaver::lengthRatioLimitLower, 0, 'f', 2)
+ .arg(KPendulumSaver::lengthRatioLimitUpper, 0, 'f', 2));
+ QToolTip::add(
+ gEdit,
+ i18n("Gravitational constant in arbitrary units.\nValid values from %1 to %2.")
+ .arg(KPendulumSaver::gLimitLower, 0, 'f', 2)
+ .arg(KPendulumSaver::gLimitUpper, 0, 'f', 2));
+ QToolTip::add(
+ eEdit,
+ i18n("Energy in units of the maximum potential energy of the given configuration.\nValid values from %1 to %2.")
+ .arg(KPendulumSaver::ELimitLower, 0, 'f', 2)
+ .arg(KPendulumSaver::ELimitUpper, 0, 'f', 2));
+ QToolTip::add(
+ persSpinBox,
+ i18n("Time in seconds after which a random perspective change occurs.\nValid values from %1 to %2.")
+ .arg(KPendulumSaver::persChangeIntervalLimitLower)
+ .arg(KPendulumSaver::persChangeIntervalLimitUpper));
+
+ // init preview area
+ preview->setBackgroundColor(black);
+ preview->show(); // otherwise saver does not get correct size
+
+ // read settings from saver and update GUI elements with these values, saver
+ // has read settings in its constructor
+
+ // set editable fields with stored values as defaults
+ QString text;
+ text.setNum(saver->massRatio());
+ mEdit->setText(text);
+ text.setNum(saver->lengthRatio());
+ lEdit->setText(text);
+ text.setNum(saver->g());
+ gEdit->setText(text);
+ text.setNum(saver->E());
+ eEdit->setText(text);
+
+ persSpinBox->setValue(saver->persChangeInterval());
+
+ barColorButton->setPaletteBackgroundColor(saver->barColor());
+ m1ColorButton->setPaletteBackgroundColor(saver->m1Color());
+ m2ColorButton->setPaletteBackgroundColor(saver->m2Color());
+
+ // if the preview area is resized it emmits the resized() event which is
+ // caught by the saver. The embedded GlArea is resized to fit into the
+ // preview area.
+ connect(preview, SIGNAL(resized(QResizeEvent*)),
+ saver, SLOT(resizeGlArea(QResizeEvent*)));
+}
+
+KPendulumSetup::~KPendulumSetup()
+{
+ delete saver;
+}
+
+// Ok pressed - save settings and exit
+void KPendulumSetup::okButtonClickedSlot()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ config->writeEntry("mass ratio", saver->massRatio());
+ config->writeEntry("length ratio", saver->lengthRatio());
+ config->writeEntry("g", saver->g());
+ config->writeEntry("E", saver->E());
+ config->writeEntry("perspective change interval",
+ saver->persChangeInterval());
+ config->writeEntry("bar color", saver->barColor());
+ config->writeEntry("m1 color", saver->m1Color());
+ config->writeEntry("m2 color", saver->m2Color());
+
+ config->sync();
+ accept();
+}
+
+void KPendulumSetup::aboutButtonClickedSlot()
+{
+ KMessageBox::about(this, i18n("\
+<h3>KPendulum Screen Saver for KDE</h3>\
+<p>Simulation of a two-part pendulum</p>\
+<p>Copyright (c) Georg&nbsp;Drenkhahn 2004</p>\
+<p><tt>georg-d@users.sourceforge.net</tt></p>"));
+}
+
+void KPendulumSetup::mEditLostFocusSlot(void)
+{
+ if (mEdit->hasAcceptableInput())
+ {
+ saver->setMassRatio(mEdit->text().toDouble());
+ }
+ else
+ { // write current setting back into input field
+ QString text;
+ text.setNum(saver->massRatio());
+ mEdit->setText(text);
+ }
+}
+void KPendulumSetup::lEditLostFocusSlot(void)
+{
+ if (lEdit->hasAcceptableInput())
+ {
+ saver->setLengthRatio(lEdit->text().toDouble());
+ }
+ else
+ { // write current setting back into input field
+ QString text;
+ text.setNum(saver->lengthRatio());
+ lEdit->setText(text);
+ }
+}
+void KPendulumSetup::gEditLostFocusSlot(void)
+{
+ if (gEdit->hasAcceptableInput())
+ {
+ saver->setG(gEdit->text().toDouble());
+ }
+ else
+ { // write current setting back into input field
+ QString text;
+ text.setNum(saver->g());
+ gEdit->setText(text);
+ }
+}
+void KPendulumSetup::eEditLostFocusSlot(void)
+{
+ if (eEdit->hasAcceptableInput())
+ {
+ saver->setE(eEdit->text().toDouble());
+ }
+ else
+ { // write current setting back into input field
+ QString text;
+ text.setNum(saver->E());
+ eEdit->setText(text);
+ }
+}
+void KPendulumSetup::persChangeEnteredSlot(int t)
+{
+ saver->setPersChangeInterval(t);
+}
+
+void KPendulumSetup::barColorButtonClickedSlot(void)
+{
+ QColor color = QColorDialog::getColor(
+ saver->barColor(), this, "bar color dialog");
+ if (color.isValid())
+ {
+ saver->setBarColor(color);
+ barColorButton->setPaletteBackgroundColor(color);
+ }
+}
+void KPendulumSetup::m1ColorButtonClickedSlot(void)
+{
+ QColor color = QColorDialog::getColor(
+ saver->m1Color(), this, "mass 1 color dialog");
+ if (color.isValid())
+ {
+ saver->setM1Color(color);
+ m1ColorButton->setPaletteBackgroundColor(color);
+ }
+}
+void KPendulumSetup::m2ColorButtonClickedSlot(void)
+{
+ QColor color = QColorDialog::getColor(
+ saver->m2Color(), this, "mass 2 color dialog");
+ if (color.isValid())
+ {
+ saver->setM2Color(color);
+ m2ColorButton->setPaletteBackgroundColor(color);
+ }
+}
diff --git a/kscreensaver/kdesavers/pendulum.h b/kscreensaver/kdesavers/pendulum.h
new file mode 100644
index 00000000..2b917a2b
--- /dev/null
+++ b/kscreensaver/kdesavers/pendulum.h
@@ -0,0 +1,388 @@
+//============================================================================
+//
+// KPendulum screen saver for KDE
+// $Id$
+// Copyright (C) 2004 Georg Drenkhahn
+//
+// This file is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+//============================================================================
+
+#ifndef __PENDULUM_H__
+#define __PENDULUM_H__
+
+// STL headers
+#include <valarray>
+// Qt headers
+#include <qwidget.h>
+#include <qtimer.h>
+#include <qgl.h>
+// GL headers
+#include <GL/glu.h>
+#include <GL/gl.h>
+// KDE headers
+#include <kscreensaver.h>
+
+#include "vec3.h"
+#include "rkodesolver.h"
+
+// KPendulumSetupUi
+#include "pendulumcfg.h"
+
+//--------------------------------------------------------------------
+
+/** @brief ODE solver for the Pendulum equations */
+class PendulumOdeSolver : public RkOdeSolver<double>
+{
+ public:
+ /** @brief Constuctor for the RK solver of the pendulum equation of motion
+ * @param t initial time in seconds
+ * @param dt initial time increment in seconds, just a hint for solver
+ * @param y generalized coordinates of pendulum system
+ * @param eps relative precision
+ * @param m1 mass of upper pendulum
+ * @param m2 mass of lower pendulum
+ * @param l1 length of upper pendulum
+ * @param l2 length of lower pendulum
+ * @param g gravitational constant */
+ PendulumOdeSolver(
+ const double &t,
+ const double &dt,
+ std::valarray<double> &y,
+ const double &eps,
+ const double &m1,
+ const double &m2,
+ const double &l1,
+ const double &l2,
+ const double &g
+ );
+
+ protected:
+ /** @brief ODE function for the pendulum equation of motion system
+ * @param x time
+ * @param y generalized coordinates of pendulum system
+ * @return derivation dy/dx */
+ std::valarray<double>
+ f(const double &x, const std::valarray<double> &y) const;
+
+ private:
+ /** These private variables contain constants for faster numeric calculation.
+ * They are derived from the constructor arguments m1,m2,l1,l2,g. */
+ const double A, B1, B, C, D, E, M;
+};
+
+
+//--------------------------------------------------------------------
+
+/** @brief GL widget class for the KPendulum screen saver
+ *
+ * Class implements QGLWidget to display the KPendulum screen saver. */
+class PendulumGLWidget : public QGLWidget
+{
+ Q_OBJECT
+
+ public:
+ /** @brief Constructor of KPendulum's GL widget
+ * @param parent parent widget, passed to QGLWidget's constructor
+ * @param name name of widget, passed to QGLWidget's constructor */
+ PendulumGLWidget(QWidget* parent=0, const char* name=0);
+ /** @brief Destructor of KPendulum's GL widget */
+ ~PendulumGLWidget(void);
+
+ /** @brief Set phi angle of viewpoint
+ * @param phi angle in sterad */
+ void setEyePhi(double phi);
+ /** @brief Set angles of pendulum configuration
+ * @param q1 angle of 1. pendulum in sterad
+ * @param q2 angle of 2. pendulum in sterad */
+ void setAngles(const double& q1, const double& q2);
+ /** @brief Set masses of pendulum configuration
+ * @param m1 mass of 1. pendulum
+ * @param m2 mass of 2. pendulum */
+ void setMasses(const double& m1, const double& m2);
+ /** @brief Set lengths of pendulum configuration
+ * @param l1 length of 1. pendulum
+ * @param l2 length of 2. pendulum */
+ void setLengths(const double& l1, const double& l2);
+
+ /* accessors for colour settings */
+
+ /** @brief set color of the bars
+ * @param c color */
+ void setBarColor(const QColor& c);
+ /** @brief get color of the bars
+ * @return color */
+ inline QColor barColor(void) const {return m_barColor;}
+ /** @brief set color of mass 1
+ * @param c color */
+ void setM1Color(const QColor& c);
+ /** @brief get color of mass 1
+ * @return color */
+ inline QColor m1Color(void) const {return m_m1Color;}
+ /** @brief set color of mass 2
+ * @param c color */
+ void setM2Color(const QColor& c);
+ /** @brief get color of mass 2
+ * @return color */
+ inline QColor m2Color(void) const {return m_m2Color;}
+
+ protected:
+ /** paint the GL view */
+ virtual void paintGL();
+ /** resize the gl view */
+ virtual void resizeGL(int w, int h);
+ /** setup the GL enviroment */
+ virtual void initializeGL();
+
+ private: // Private attributes
+ /** Eye position distance from coordinate zero point */
+ GLfloat eyeR;
+ /** Eye position theta angle from z axis in sterad */
+ double eyeTheta;
+ /** Eye position phi angle (longitude) in sterad */
+ double eyePhi;
+ /** Light position distance from coordinate zero point */
+ GLfloat lightR;
+ /** Light position theta angle from z axis in sterad */
+ double lightTheta;
+ /** Light position phi angle (longitude) in sterad */
+ double lightPhi;
+
+ /** 1. pendulum's angle, degree */
+ GLfloat ang1;
+ /** 2. pendulum's angle, degree */
+ GLfloat ang2;
+
+ /** 1. pendulum's square root of mass */
+ GLfloat sqrtm1;
+ /** 2. pendulum's square root of mass */
+ GLfloat sqrtm2;
+
+ /** 1. pendulum's length */
+ GLfloat l1;
+ /** 2. pendulum's length */
+ GLfloat l2;
+
+ /** Pointer to a quadric object used in the rendering function paintGL() */
+ GLUquadricObj* const quadM1;
+
+ /** color of the pendulum bars */
+ QColor m_barColor;
+ /** color of the 1. mass */
+ QColor m_m1Color;
+ /** color of the 2. mass */
+ QColor m_m2Color;
+};
+
+//--------------------------------------------------------------------
+
+/** @brief Main class of the KPendulum screen saver
+ *
+ * This class implements KScreenSaver for the KPendulum screen saver. */
+class KPendulumSaver : public KScreenSaver
+{
+ Q_OBJECT
+
+ public:
+ /** @brief Constructor of the KPendulum screen saver object
+ * @param drawable Id of the window in which the screen saver is drawed
+ *
+ * Initial settings are read from disk, the GL widget is set up and displayed
+ * and the eq. of motion solver is started. */
+ KPendulumSaver(WId drawable);
+ /** @brief Destructor of the KPendulum screen saver object
+ *
+ * Only KPendulumSaver::solver is destoyed. */
+ ~KPendulumSaver();
+ /** read the saved settings from disk */
+ void readSettings();
+ /** init physical quantities, set up the GL area and (re)start the ode
+ * solver. Called if new parameters are specified in the setup dialog and at
+ * startup. */
+ void initData();
+
+ /* accessors for PendulumGLWidget member variables */
+
+ /** Set the displayed bar color of the pendulum */
+ void setBarColor(const QColor& c);
+ /** Get the displayed bar color of the pendulum */
+ QColor barColor(void) const;
+
+ static const QColor barColorDefault;
+
+ /** Set the displayed color of the 1. pendulum mass */
+ void setM1Color(const QColor& c);
+ /** Get the displayed color of the 1. pendulum mass */
+ QColor m1Color(void) const;
+
+ static const QColor m1ColorDefault;
+
+ /** Set the displayed color of the 2. pendulum mass */
+ void setM2Color(const QColor& c);
+ /** Get the displayed color of the 2. pendulum mass */
+ QColor m2Color(void) const;
+
+ static const QColor m2ColorDefault;
+
+ /* accessors for own member variables */
+
+ /** Set the mass ratio of the pendulum system. @sa
+ * KPendulumSaver::m_massRatio */
+ void setMassRatio(const double& massRatio);
+ /** Get the mass ratio of the pendulum system. @sa
+ * KPendulumSaver::m_massRatio */
+ inline double massRatio(void) const {return m_massRatio;}
+
+ // lower, upper limits (inclusive) and default values for the setup
+ // parameters
+ static const double massRatioLimitUpper;
+ static const double massRatioLimitLower;
+ static const double massRatioDefault;
+
+ /** Set the length ratio of the pendulum system. @sa
+ * KPendulumSaver::m_lengthRatio */
+ void setLengthRatio(const double& lengthRatio);
+ /** Get the length ratio of the pendulum system. @sa
+ * KPendulumSaver::m_lengthRatio */
+ inline double lengthRatio(void) const {return m_lengthRatio;}
+
+ static const double lengthRatioLimitLower;
+ static const double lengthRatioLimitUpper;
+ static const double lengthRatioDefault;
+
+ /** Set the gravitational constant. @sa KPendulumSaver::m_g */
+ void setG(const double& g);
+ /** Get the gravitational constant. @sa KPendulumSaver::m_g */
+ inline double g(void) const {return m_g;}
+
+ static const double gLimitLower;
+ static const double gLimitUpper;
+ static const double gDefault;
+
+ /** Set the total energy. @sa KPendulumSaver::m_E */
+ void setE(const double& E);
+ /** Get the total energy. @sa KPendulumSaver::m_E */
+ inline double E(void) const {return m_E;}
+
+ static const double ELimitLower;
+ static const double ELimitUpper;
+ static const double EDefault;
+
+ /** Set the time interval for the periodic perspective change. @sa
+ * KPendulumSaver::m_persChangeInterval */
+ void setPersChangeInterval(const unsigned int& persChangeInterval);
+ /** Get the time interval for the periodic perspective change. @sa
+ * KPendulumSaver::m_persChangeInterval */
+ inline unsigned int persChangeInterval(void) const
+ {return m_persChangeInterval;}
+
+ static const unsigned int persChangeIntervalLimitLower = 5;
+ static const unsigned int persChangeIntervalLimitUpper = 600;
+ static const unsigned int persChangeIntervalDefault = 15;
+
+ public slots:
+ /** slot is called if integration should proceed by ::deltaT */
+ void doTimeStep();
+ /** slot is called if setup dialog changes in size and the GL are should be
+ * adjusted */
+ void resizeGlArea(QResizeEvent* e);
+
+ private:
+ /** The ode solver which is used to integrate the equations of motion */
+ PendulumOdeSolver* solver;
+ /** Gl widget of simulation */
+ PendulumGLWidget* glArea;
+ /** Timer for the real time integration of the eqs. of motion */
+ QTimer* timer;
+
+ /** Time step size for the integration in milliseconds. 20 ms corresponds to
+ * a frame rate of 50 fps. */
+ static const unsigned int deltaT = 20;
+ static const double eyePhiDefault;
+
+ // saved settings
+
+ /** Mass ratio m2/(m1+m2) of the pendulum masses. Value is determined by the
+ * setup dialog. Variable is accessed by setMassRatio() and massRatio(). */
+ double m_massRatio;
+ /** Length ratio l2/(l1+l2) of the pendulums. Value is determined by the
+ * setup dialog. Variable is accessed by setLengthRatio() and
+ * lengthRatio(). */
+ double m_lengthRatio;
+ /** Gravitational constant (in arbitrary units). Value is determined by the
+ * setup dialog. Variable is accessed by setG() and g(). */
+ double m_g;
+ /** Total energy of the system in units of the maximum possible potential
+ * energy. Value is determined by the setup dialog. Variable is accessed by
+ * setE() and E(). */
+ double m_E;
+ /** Time interval after which a new perspective changed happens. Value is
+ * determined by the setup dialog. Variable is accessed by
+ * setPersChangeInterval() and persChangeInterval(). */
+ unsigned int m_persChangeInterval;
+};
+
+//--------------------------------------------------------------------
+
+/** @brief KPendulum screen saver setup dialog.
+ *
+ * This class handles the KPendulum screen saver setup dialog. */
+class KPendulumSetup : public KPendulumSetupUi
+{
+ Q_OBJECT
+
+ public:
+ /** @brief Constructor for the KPendulum screen saver setup dialog
+ * @param parent Pointer to the parent widget, passed to KPendulumSetupUi
+ * @param name Widget name
+ *
+ * The dialog box is set up and the screen saver object KPendulumSetup::saver
+ * is instantiated. */
+ KPendulumSetup(QWidget* parent = 0, const char* name = 0);
+ /** @brief Destructor of the KPendulum screen saver setup dialog
+ *
+ * Only KPendulumSetup::saver is deleted. */
+ ~KPendulumSetup(void);
+
+ public slots:
+ /** slot for the "OK" button: save settings and exit */
+ void okButtonClickedSlot(void);
+ /** slot for the "About" button: show the About dialog */
+ void aboutButtonClickedSlot(void);
+
+ /** slot is called if the mass ratio edit field looses its focus. If the
+ * input is acceptable KPendulumSaver::setMassRatio() is called. */
+ void mEditLostFocusSlot(void);
+ /** slot is called if the length ratio edit field looses its focus. If the
+ * input is acceptable KPendulumSaver::setLengthRatio() is called. */
+ void lEditLostFocusSlot(void);
+ /** slot is called if the gravitational constant edit field looses its focus.
+ * If the input is acceptable KPendulumSaver::setG() is called. */
+ void gEditLostFocusSlot(void);
+ /** slot is called if the energy edit field looses its focus. If the input
+ * is acceptable KPendulumSaver::setE() is called. */
+ void eEditLostFocusSlot(void);
+ /** slot is called if the perspective change interval spin box changed. If
+ * the input is acceptable KPendulumSaver::setPersChangeInterval() is
+ * called. */
+ void persChangeEnteredSlot(int t);
+
+ /** slot is called if the bar color button was clicked. A color dialog is
+ * opened and the result is given to KPendulumSaver::setBarColor(). */
+ void barColorButtonClickedSlot(void);
+ /** slot is called if the mass 1 color button was clicked. A color dialog is
+ * opened and the result is given to KPendulumSaver::setM1Color(). */
+ void m1ColorButtonClickedSlot(void);
+ /** slot is called if the mass 2 color button was clicked. A color dialog is
+ * opened and the result is given to KPendulumSaver::setM2Color(). */
+ void m2ColorButtonClickedSlot(void);
+
+ private:
+ /** Pointer to the screen saver object. Its member KPendulumSaver::glArea is
+ * displayed in the preview area */
+ KPendulumSaver* saver;
+};
+
+#endif
diff --git a/kscreensaver/kdesavers/pendulumcfg.ui b/kscreensaver/kdesavers/pendulumcfg.ui
new file mode 100644
index 00000000..51454a00
--- /dev/null
+++ b/kscreensaver/kdesavers/pendulumcfg.ui
@@ -0,0 +1,566 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KPendulumSetupUi</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KPendulumSetupUi</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>474</width>
+ <height>349</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>2</horstretch>
+ <verstretch>2</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>1200</width>
+ <height>900</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>400</width>
+ <height>250</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>KPendulum Setup</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>Minimum</enum>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout18</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string>&lt;p align="center"&gt;
+m&lt;sub&gt;2&lt;/sub&gt;&lt;br&gt;
+-----------&lt;br&gt;
+m&lt;sub&gt;1&lt;/sub&gt;+m&lt;sub&gt;2&lt;/sub&gt;
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>mEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxLength">
+ <number>5</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p align="center"&gt;
+l&lt;sub&gt;2&lt;/sub&gt;&lt;br&gt;
+------&lt;br&gt;
+l&lt;sub&gt;1&lt;/sub&gt;+l&lt;sub&gt;2&lt;/sub&gt;
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>lEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxLength">
+ <number>5</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>g</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>gEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxLength">
+ <number>5</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>E</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>eEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxLength">
+ <number>5</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout18</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Perspective&lt;br&gt;
+Change [s]</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>specify the time in seconds after which a random perspective change occurs</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>persSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>32767</height>
+ </size>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>barColorButton</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Bars</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m1ColorButton</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>M1</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m2ColorButton</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>M2</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="SsPreviewArea">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>2</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>200</width>
+ <height>150</height>
+ </size>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>66</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>OkButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>AboutButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;About</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>65</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>SsPreviewArea</class>
+ <header location="global">sspreviewarea.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>OkButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>okButtonClickedSlot()</slot>
+ </connection>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>AboutButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>aboutButtonClickedSlot()</slot>
+ </connection>
+ <connection>
+ <sender>lEdit</sender>
+ <signal>lostFocus()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>lEditLostFocusSlot()</slot>
+ </connection>
+ <connection>
+ <sender>gEdit</sender>
+ <signal>lostFocus()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>gEditLostFocusSlot()</slot>
+ </connection>
+ <connection>
+ <sender>eEdit</sender>
+ <signal>lostFocus()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>eEditLostFocusSlot()</slot>
+ </connection>
+ <connection>
+ <sender>persSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>persChangeEnteredSlot(int)</slot>
+ </connection>
+ <connection>
+ <sender>mEdit</sender>
+ <signal>lostFocus()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>mEditLostFocusSlot()</slot>
+ </connection>
+ <connection>
+ <sender>barColorButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>barColorButtonClickedSlot()</slot>
+ </connection>
+ <connection>
+ <sender>m1ColorButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>m1ColorButtonClickedSlot()</slot>
+ </connection>
+ <connection>
+ <sender>m2ColorButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KPendulumSetupUi</receiver>
+ <slot>m2ColorButtonClickedSlot()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>okButtonClickedSlot()</slot>
+ <slot>aboutButtonClickedSlot()</slot>
+ <slot>mEditLostFocusSlot(void)</slot>
+ <slot>lEditLostFocusSlot(void)</slot>
+ <slot>gEditLostFocusSlot(void)</slot>
+ <slot>eEditLostFocusSlot(void)</slot>
+ <slot>persChangeEnteredSlot(int)</slot>
+ <slot>barColorButtonClickedSlot(void)</slot>
+ <slot>m1ColorButtonClickedSlot(void)</slot>
+ <slot>m2ColorButtonClickedSlot(void)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>sspreviewarea.h</includehint>
+</includehints>
+</UI>
diff --git a/kscreensaver/kdesavers/polygon.cpp b/kscreensaver/kdesavers/polygon.cpp
new file mode 100644
index 00000000..55e052f1
--- /dev/null
+++ b/kscreensaver/kdesavers/polygon.cpp
@@ -0,0 +1,366 @@
+//-----------------------------------------------------------------------------
+//
+// kpolygon - Basic screen saver for KDE
+//
+// Copyright (c) Martin R. Jones 1996
+//
+// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org>
+// 2001/03/04 Converted to libkscreensaver by Martin R. Jones
+
+#include <config.h>
+#include <stdlib.h>
+#include <time.h>
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+
+#include "polygon.h"
+#include <qpainter.h>
+
+#include "polygon.moc"
+
+
+#define MAXLENGTH 65
+#define MAXVERTICES 19
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kpolygon.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "KPolygon" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new kPolygonSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new kPolygonSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// dialog to setup screen saver parameters
+//
+kPolygonSetup::kPolygonSetup( QWidget *parent, const char *name )
+ : KDialogBase( parent, name, true, i18n( "Setup Polygon Screen Saver" ),
+ Ok|Cancel|Help, Ok, true ), saver( 0 ), length( 10 ), vertices( 3 ),
+ speed( 50 )
+{
+ readSettings();
+
+ QWidget *main = makeMainWidget();
+ setButtonText( Help, i18n( "A&bout" ) );
+
+ QHBoxLayout *tl = new QHBoxLayout(main, 0, spacingHint());
+ QVBoxLayout *tl1 = new QVBoxLayout;
+ tl->addLayout(tl1);
+
+ QLabel *label = new QLabel( i18n("Length:"), main );
+ tl1->addWidget(label);
+
+ QSlider *sb = new QSlider(1, MAXLENGTH, 10, length, QSlider::Horizontal,
+ main );
+ sb->setMinimumSize( 90, 20 );
+ sb->setTickmarks(QSlider::Below);
+ sb->setTickInterval(10);
+ connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotLength( int ) ) );
+ tl1->addWidget(sb);
+
+ label = new QLabel( i18n("Vertices:"), main );
+ tl1->addWidget(label);
+
+ sb = new QSlider(3, MAXVERTICES, 2, vertices, QSlider::Horizontal, main);
+ sb->setMinimumSize( 90, 20 );
+ sb->setTickmarks(QSlider::Below);
+ sb->setTickInterval(2);
+ connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotVertices( int ) ) );
+ tl1->addWidget(sb);
+
+ label = new QLabel( i18n("Speed:"), main );
+ tl1->addWidget(label);
+
+ sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, main);
+ sb->setMinimumSize( 90, 20 );
+ sb->setTickmarks(QSlider::Below);
+ sb->setTickInterval(10);
+ connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) );
+ tl1->addWidget(sb);
+ tl1->addStretch();
+
+ preview = new QWidget( main );
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new kPolygonSaver( preview->winId() );
+ tl->addWidget(preview);
+
+ setMinimumSize( sizeHint() );
+}
+
+kPolygonSetup::~kPolygonSetup()
+{
+ delete saver;
+}
+
+// read settings from config file
+void kPolygonSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ length = config->readNumEntry( "Length", length );
+ if ( length > MAXLENGTH )
+ length = MAXLENGTH;
+ else if ( length < 1 )
+ length = 1;
+
+ vertices = config->readNumEntry( "Vertices", vertices );
+ if ( vertices > MAXVERTICES )
+ vertices = MAXVERTICES;
+ else if ( vertices < 3 )
+ vertices = 3;
+
+ speed = config->readNumEntry( "Speed", speed );
+ if ( speed > 100 )
+ speed = 100;
+ else if ( speed < 50 )
+ speed = 50;
+}
+
+void kPolygonSetup::slotLength( int len )
+{
+ length = len;
+ if ( saver )
+ saver->setPolygon( length, vertices );
+}
+
+void kPolygonSetup::slotVertices( int num )
+{
+ vertices = num;
+ if ( saver )
+ saver->setPolygon( length, vertices );
+}
+
+void kPolygonSetup::slotSpeed( int num )
+{
+ speed = num;
+ if ( saver )
+ saver->setSpeed( speed );
+}
+
+// Ok pressed - save settings and exit
+void kPolygonSetup::slotOk()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ QString slength;
+ slength.setNum( length );
+ config->writeEntry( "Length", slength );
+
+ QString svertices;
+ svertices.setNum( vertices );
+ config->writeEntry( "Vertices", svertices );
+
+ QString sspeed;
+ sspeed.setNum( speed );
+ config->writeEntry( "Speed", sspeed );
+
+ config->sync();
+
+ accept();
+}
+
+void kPolygonSetup::slotHelp()
+{
+ KMessageBox::information(this,
+ i18n("Polygon Version 2.2.0\n\n"\
+ "Written by Martin R. Jones 1996\n"\
+ "mjones@kde.org"));
+}
+
+//-----------------------------------------------------------------------------
+
+
+kPolygonSaver::kPolygonSaver( WId id ) : KScreenSaver( id )
+{
+ polygons.setAutoDelete( TRUE );
+
+ readSettings();
+
+ directions.resize( numVertices );
+ colorContext = QColor::enterAllocContext();
+
+ blank();
+
+ initialiseColor();
+ initialisePolygons();
+
+ timer.start( speed );
+ connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) );
+}
+
+kPolygonSaver::~kPolygonSaver()
+{
+ timer.stop();
+ QColor::leaveAllocContext();
+ QColor::destroyAllocContext( colorContext );
+}
+
+// set polygon properties
+void kPolygonSaver::setPolygon( int len, int ver )
+{
+ timer.stop();
+ numLines = len;
+ numVertices = ver;
+
+ directions.resize( numVertices );
+ polygons.clear();
+ initialisePolygons();
+ blank();
+
+ timer.start( speed );
+}
+
+// set the speed
+void kPolygonSaver::setSpeed( int spd )
+{
+ timer.stop();
+ speed = 100-spd;
+ timer.start( speed );
+}
+
+// read configuration settings from config file
+void kPolygonSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ numLines = config->readNumEntry( "Length", 10 );
+ if ( numLines > 50 )
+ numLines = 50;
+ else if ( numLines < 1 )
+ numLines = 1;
+
+ numVertices = config->readNumEntry( "Vertices", 3 );
+ if ( numVertices > 20 )
+ numVertices = 20;
+ else if ( numVertices < 3 )
+ numVertices = 3;
+
+ speed = 100 - config->readNumEntry( "Speed", 50 );
+}
+
+// draw next polygon and erase tail
+void kPolygonSaver::slotTimeout()
+{
+ QPainter p( this );
+ if ( polygons.count() > numLines )
+ {
+ p.setPen( black );
+ p.drawPolyline( *polygons.first() );
+ }
+
+ nextColor();
+ p.setPen( colors[currentColor] );
+ p.drawPolyline( *polygons.last() );
+
+ if ( polygons.count() > numLines )
+ polygons.removeFirst();
+
+ polygons.append( new QPointArray( polygons.last()->copy() ) );
+ moveVertices();
+}
+
+void kPolygonSaver::blank()
+{
+ setBackgroundColor( black );
+ erase();
+}
+
+// initialise the polygon
+void kPolygonSaver::initialisePolygons()
+{
+ int i;
+
+ polygons.append( new QPointArray( numVertices + 1 ) );
+
+ QPointArray &poly = *polygons.last();
+
+ for ( i = 0; i < numVertices; i++ )
+ {
+ poly.setPoint( i, rnd.getLong(width()), rnd.getLong(height()) );
+ directions[i].setX( 16 - rnd.getLong(8) * 4 );
+ if ( directions[i].x() == 0 )
+ directions[i].setX( 1 );
+ directions[i].setY( 16 - rnd.getLong(8) * 4 );
+ if ( directions[i].y() == 0 )
+ directions[i].setY( 1 );
+ }
+
+ poly.setPoint( i, poly.point(0) );
+}
+
+// move polygon in current direction and change direction if a border is hit
+void kPolygonSaver::moveVertices()
+{
+ int i;
+ QPointArray &poly = *polygons.last();
+
+ for ( i = 0; i < numVertices; i++ )
+ {
+ poly.setPoint( i, poly.point(i) + directions[i] );
+ if ( poly[i].x() >= (int)width() )
+ {
+ directions[i].setX( -(rnd.getLong(4) + 1) * 4 );
+ poly[i].setX( (int)width() );
+ }
+ else if ( poly[i].x() < 0 )
+ {
+ directions[i].setX( (rnd.getLong(4) + 1) * 4 );
+ poly[i].setX( 0 );
+ }
+
+ if ( poly[i].y() >= (int)height() )
+ {
+ directions[i].setY( -(rnd.getLong(4) + 1) * 4 );
+ poly[i].setY( height() );
+ }
+ else if ( poly[i].y() < 0 )
+ {
+ directions[i].setY( (rnd.getLong(4) + 1) * 4 );
+ poly[i].setY( 0 );
+ }
+ }
+
+ poly.setPoint( i, poly.point(0) );
+}
+
+// create a color table of 64 colors
+void kPolygonSaver::initialiseColor()
+{
+ for ( int i = 0; i < 64; i++ )
+ {
+ colors[i].setHsv( i * 360 / 64, 255, 255 );
+ }
+
+ currentColor = 0;
+}
+
+// set foreground color to next in the table
+void kPolygonSaver::nextColor()
+{
+ currentColor++;
+
+ if ( currentColor > 63 )
+ currentColor = 0;
+}
+
diff --git a/kscreensaver/kdesavers/polygon.h b/kscreensaver/kdesavers/polygon.h
new file mode 100644
index 00000000..bfaac8a4
--- /dev/null
+++ b/kscreensaver/kdesavers/polygon.h
@@ -0,0 +1,79 @@
+//-----------------------------------------------------------------------------
+//
+// kpolygon - Basic screen saver for KDE
+//
+// Copyright (c) Martin R. Jones 1996
+//
+
+#ifndef __POLYGON_H__
+#define __POLYGON_H__
+
+#include <qtimer.h>
+#include <qptrlist.h>
+
+#include <kdialogbase.h>
+#include <kscreensaver.h>
+#include <krandomsequence.h>
+
+class kPolygonSaver : public KScreenSaver
+{
+ Q_OBJECT
+public:
+ kPolygonSaver( WId id );
+ virtual ~kPolygonSaver();
+
+ void setPolygon( int len, int ver );
+ void setSpeed( int spd );
+
+private:
+ void readSettings();
+ void blank();
+ void initialisePolygons();
+ void moveVertices();
+ void initialiseColor();
+ void nextColor();
+
+protected slots:
+ void slotTimeout();
+
+protected:
+ QTimer timer;
+ unsigned numLines;
+ int numVertices;
+ int colorContext;
+ int speed;
+ QColor colors[64];
+ int currentColor;
+ QPtrList<QPointArray> polygons;
+ QMemArray<QPoint> directions;
+ KRandomSequence rnd;
+};
+
+class kPolygonSetup : public KDialogBase
+{
+ Q_OBJECT
+public:
+ kPolygonSetup( QWidget *parent = 0, const char *name = 0 );
+ ~kPolygonSetup();
+
+protected:
+ void readSettings();
+
+private slots:
+ void slotLength( int );
+ void slotVertices( int );
+ void slotSpeed( int );
+ void slotOk();
+ void slotHelp();
+
+private:
+ QWidget *preview;
+ kPolygonSaver *saver;
+
+ int length;
+ int vertices;
+ int speed;
+};
+
+#endif
+
diff --git a/kscreensaver/kdesavers/rkodesolver.cpp b/kscreensaver/kdesavers/rkodesolver.cpp
new file mode 100644
index 00000000..2127a110
--- /dev/null
+++ b/kscreensaver/kdesavers/rkodesolver.cpp
@@ -0,0 +1,252 @@
+//============================================================================
+//
+// Ordinary differential equation solver using the Runge-Kutta method.
+// $Id$
+// Copyright (C) 2004 Georg Drenkhahn
+//
+// This file is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+//============================================================================
+
+#include <kdebug.h>
+#include "rkodesolver.h"
+
+template<typename T>
+RkOdeSolver<T>::RkOdeSolver(const T &x,
+ const std::valarray<T>& y,
+ const T &dx,
+ const T &eps)
+ : mX(x)
+{
+ Y(y);
+ dX(dx);
+ Eps(eps);
+}
+
+// virtual dtor
+template<typename T>
+RkOdeSolver<T>::~RkOdeSolver(void)
+{}
+
+// accessors
+
+template<typename T>
+void
+RkOdeSolver<T>::dX(const T &a)
+{
+ if (a < 0.0)
+ {
+ kdDebug() << "RkOdeSolver: dx was negative, made it positive" << endl;
+ mStep = -a;
+ }
+ else if (a == 0.0)
+ {
+ mStep = 0.001; // a very arbitrary value
+ kdDebug() << "RkOdeSolver: dx == 0, set it to " << mStep << endl;
+ }
+ else
+ {
+ mStep = a;
+ }
+}
+
+template<typename T>
+void
+RkOdeSolver<T>::Eps(const T &a)
+{
+ if (a < 0.0)
+ {
+ kdDebug() << "RkOdeSolver: eps was negative, made it positive" << endl;
+ mEps = -a;
+ }
+ else if (a == 0.0)
+ {
+ mEps = 1e-5; // a very arbitrary value
+ kdDebug() << "RkOdeSolver: eps == 0, set it to 1e-5" << endl;
+ }
+ else
+ {
+ mEps = a;
+ }
+}
+
+template<typename T>
+void
+RkOdeSolver<T>::Y(const std::valarray<T> &a)
+{
+ mY.resize(a.size());
+ mY = a;
+}
+
+
+// public member functions
+
+template<typename T>
+void
+RkOdeSolver<T>::integrate(const T &deltaX)
+{
+ if (deltaX == 0)
+ {
+ return; // nothing to integrate
+ }
+
+ // init dydx if uninitialised
+ if (mDydx.size() != mY.size())
+ {
+ mDydx.resize(mY.size());
+ mDydx = f(mX,mY);
+ }
+
+ static const unsigned int maxiter = 10000;
+ const T x2 = mX + deltaX;
+
+ unsigned int iter;
+ for (iter=0;
+ iter<maxiter && rkStepCheck(x2-mX) == false;
+ ++iter)
+ {}
+
+ if (iter>maxiter)
+ {
+ kdDebug() << "RkOdeSolver: More than " << maxiter
+ << " iterations in RkOdeSolver::integrate" << endl;
+ // TODO throw exeption here
+ }
+}
+
+
+// private member functions
+
+template<typename T>
+bool
+RkOdeSolver<T>::rkStepCheck(const T& dx_requested)
+{
+ static const T safety = 0.9;
+ static const T pshrnk = -0.25;
+ static const T pgrow = -0.2;
+
+ // reduce step size by no more than a factor 10
+ static const T shrinkLimit = 0.1;
+ // enlarge step size by no more than a factor 5
+ static const T growthLimit = 5.0;
+ // errmax_sl = 6561.0
+ static const T errmax_sl = pow(shrinkLimit/safety, 1.0/pshrnk);
+ // errmax_gl = 1.89e-4
+ static const T errmax_gl = pow(growthLimit/safety, 1.0/pgrow);
+
+ static const unsigned int maxiter = 100;
+
+ if (dx_requested == 0)
+ {
+ return true; // integration done
+ }
+
+ std::valarray<T> ytmp(mY.size());
+ std::valarray<T> yerr(mY.size());
+ std::valarray<T> t(mY.size());
+
+ bool stepSizeWasMaximal;
+ T dx;
+ if (std::abs(dx_requested) > mStep)
+ {
+ stepSizeWasMaximal = true;
+ dx = dx_requested>0 ? mStep : -mStep;
+ }
+ else
+ {
+ stepSizeWasMaximal = false;
+ dx = dx_requested;
+ }
+
+ // generic scaling factor
+ std::valarray<T> yscal = std::abs(mY) + std::abs(dx*mDydx) + 1e-15;
+
+ unsigned int iter = 0;
+ T errmax = 0;
+ do
+ {
+ if (errmax >= 1.0)
+ {
+ // reduce step size
+ dx *= errmax<errmax_sl ? safety * pow(errmax, pshrnk) : shrinkLimit;
+ stepSizeWasMaximal = true;
+ if (mX == mX + dx)
+ {
+ // stepsize below numerical resolution
+ kdDebug() << "RkOdeSolver: stepsize underflow in rkStepCheck"
+ << endl;
+ // TODO throw exeption here
+ exit(0);
+ }
+ // new dx -> update scaling vector
+ yscal = std::abs(mY) + std::abs(dx*mDydx) + 1e-15;
+ }
+
+ ytmp = rkStep(dx, yerr); // try to make a step forward
+ t = std::abs(yerr/yscal); // calc the error vector
+ errmax = t.max()/mEps; // calc the rel. maximal error
+ ++iter;
+ } while (iter < maxiter && errmax >= 1.0);
+
+ if (iter >= maxiter)
+ {
+ kdDebug() << "RkOdeSolver: too many iterations in rkStepCheck" << endl;
+ // TODO throw exeption here
+ exit(0);
+ }
+
+ if (stepSizeWasMaximal == true)
+ {
+ // estimate next step size if used step size was maximal
+ mStep =
+ std::abs(dx)
+ * (errmax>errmax_gl ? safety * pow(errmax, pgrow) : growthLimit);
+ }
+ mX += dx; // make step forward
+ mY = ytmp; // save new function values
+ mDydx = f(mX,mY); // and update derivatives
+
+ return std::abs(dx) < std::abs(dx_requested);
+}
+
+template<typename T>
+std::valarray<T>
+RkOdeSolver<T>::rkStep(const T& dx, std::valarray<T>& yerr) const
+{
+ static const T
+ a2=0.2, a3=0.3, a4=0.6, a5=1.0, a6=0.875,
+ b21=0.2,
+ b31=3.0/40.0, b32=9.0/40.0,
+ b41=0.3, b42=-0.9, b43=1.2,
+ b51=-11.0/54.0, b52=2.5, b53=-70.0/27.0, b54=35.0/27.0,
+ b61=1631.0/55296.0, b62=175.0/512.0, b63=575.0/13824.0,
+ b64=44275.0/110592.0, b65=253.0/4096.0,
+ c1=37.0/378.0, c3=250.0/621.0, c4=125.0/594.0, c6=512.0/1771.0,
+ dc1=c1-2825.0/27648.0, dc3=c3-18575.0/48384.0,
+ dc4=c4-13525.0/55296.0, dc5=-277.0/14336.0, dc6=c6-0.25;
+
+ std::valarray<T> ak2 = f(mX + a2*dx,
+ mY + dx*b21*mDydx); // 2. step
+ std::valarray<T> ak3 = f(mX + a3*dx,
+ mY + dx*(b31*mDydx + b32*ak2)); // 3.step
+ std::valarray<T> ak4 = f(mX + a4*dx,
+ mY + dx*(b41*mDydx + b42*ak2
+ + b43*ak3)); // 4.step
+ std::valarray<T> ak5 = f(mX + a5*dx,
+ mY + dx*(b51*mDydx + b52*ak2
+ + b53*ak3 + b54*ak4)); // 5.step
+ std::valarray<T> ak6 = f(mX + a6*dx,
+ mY + dx*(b61*mDydx + b62*ak2
+ + b63*ak3 + b64*ak4
+ + b65*ak5)); // 6.step
+ yerr = dx*(dc1*mDydx + dc3*ak3 + dc4*ak4 + dc5*ak5 + dc6*ak6);
+ return mY + dx*( c1*mDydx + c3*ak3 + c4*ak4 + c6*ak6);
+}
+
+
+// explicite instantiations
+//template RkOdeSolver<long double>;
+template class RkOdeSolver<double>;
+//template RkOdeSolver<float>;
diff --git a/kscreensaver/kdesavers/rkodesolver.h b/kscreensaver/kdesavers/rkodesolver.h
new file mode 100644
index 00000000..d1f9d556
--- /dev/null
+++ b/kscreensaver/kdesavers/rkodesolver.h
@@ -0,0 +1,187 @@
+//============================================================================
+//
+// Ordinary differential equation solver using the Runge-Kutta method.
+// $Id$
+// Copyright (C) 2004 Georg Drenkhahn
+//
+// This file is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+//============================================================================
+
+#ifndef RKODESOLVER_H
+#define RKODESOLVER_H
+
+// STL headers
+#include <valarray>
+
+/** @brief Solver class to integrate a first-order ordinary differential
+ * equation (ODE) by means of a 6. order Runge-Kutta method.
+ *
+ * The ODE system must be given as the derivative
+ * dy/dx = f(x,y)
+ * with x in R and y in R^n.
+ *
+ * Within this class the function f() is a pure virtual function, which must be
+ * reimplemented in a derived class.
+ *
+ * No other special data type for vectors or matrices are needed besides the STL
+ * class std::valarray. */
+template<typename T>
+class RkOdeSolver
+{
+ public:
+ /** @brief Constructor
+ * @param x Initial integration parameter
+ * @param y Initial function values of function to integrate
+ * @param dx Initial guess for step size. Will be automatically adjusted to
+ * guarantee required precision.
+ * @param eps Relative precision
+ *
+ * Initialises the solver with start conditions. */
+ RkOdeSolver(const T& x=0.0,
+ const std::valarray<T>& y=std::valarray<T>(0),
+ const T& dx=0,
+ const T& eps=1e-6);
+ /** @brief Destructor */
+ virtual ~RkOdeSolver(void);
+
+ /** @brief Integrates the ordinary differential equation from the current x
+ * value to x+@a dx.
+ * @param dx x-interval size to integrate over starting from x. dx may be
+ * negative.
+ *
+ * The integration is performed by calling rkStepCheck() repeatedly until the
+ * desired x value is reached. */
+ void integrate(const T& dx);
+
+ // Accessors
+
+ // get/set x value
+ /** @brief Get current x value.
+ * @return Reference of x value. */
+ const T& X(void) const;
+ /** @brief Set current x value.
+ * @param a The value to be set. */
+ void X(const T& a);
+
+ // get/set y value
+ /** @brief Get current y value.
+ * @return Reference of y vector. */
+ const std::valarray<T>& Y(void) const;
+ /** @brief Set current y values.
+ * @param a The vector to be set. */
+ void Y(const std::valarray<T>& a);
+
+ /** @brief Get current dy/dx value.
+ * @return Reference of dy/dx vector. */
+ const std::valarray<T>& dYdX(void) const;
+
+ // get/set dx value
+ /** @brief Get current estimated step size dX.
+ * @return Reference of dX value. */
+ const T& dX(void) const;
+ /** @brief Set estimated step size dX.
+ * @param a The value to be set. */
+ void dX(const T& a);
+
+ // get/set eps value
+ /** @brief Get current presision.
+ * @return Reference of precision value. */
+ const T& Eps(void) const;
+ /** @brief Set estimated presision.
+ * @param a The value to be set. */
+ void Eps(const T& a);
+
+ protected:
+ // purely virtual function which is integrated
+ /** @brief ODE function
+ * @param x Integration value
+ * @param y Function value
+ * @return Derivation
+ *
+ * This purely virtual function returns the value of dy/dx for the given
+ * parameter values of x and y. */
+ virtual std::valarray<T>
+ f(const T& x, const std::valarray<T>& y) const = 0;
+
+ private:
+ /** @brief Perform one integration step with a tolerable relative error given
+ * by ::mErr.
+ * @param dx Maximal step size, may be positive or negative depending on
+ * integration direction.
+ * @return Flag indicating if made absolute integration step was equal |@a dx
+ * | (true) less than |@a dx | (false).
+ *
+ * A new estimate for the maximum next step size is saved to ::mStep. The
+ * new values for x, y and f are saved in ::mX, ::mY and ::mDydx. */
+ bool rkStepCheck(const T& dx);
+ /** @brief Perform one Runge-Kutta integration step forward with step size
+ * ::mStep
+ * @param dx Step size relative to current x value.
+ * @param yerr Reference to vector in which the estimated error made in y is
+ * returned.
+ * @return The y value after the step at x+@a dx.
+ *
+ * Stored current x,y values are not adjusted. */
+ std::valarray<T> rkStep(const T& dx, std::valarray<T>& yerr) const;
+
+ /** current x value */
+ T mX;
+ /** current y value */
+ std::valarray<T> mY;
+ /** current value of dy/dx */
+ std::valarray<T> mDydx;
+
+ /** allowed relative error */
+ T mEps;
+ /** estimated step size for next Runge-Kutta step */
+ T mStep;
+};
+
+// inline accessors
+
+template<typename T>
+inline const T&
+RkOdeSolver<T>::X(void) const
+{
+ return mX;
+}
+
+template<typename T>
+inline void
+RkOdeSolver<T>::X(const T &a)
+{
+ mX = a;
+}
+
+template<typename T>
+inline const std::valarray<T>&
+RkOdeSolver<T>::Y(void) const
+{
+ return mY;
+}
+
+template<typename T>
+inline const std::valarray<T>&
+RkOdeSolver<T>::dYdX(void) const
+{
+ return mDydx;
+}
+
+template<typename T>
+inline const T&
+RkOdeSolver<T>::dX(void) const
+{
+ return mStep;
+}
+
+template<typename T>
+inline const T&
+RkOdeSolver<T>::Eps(void) const
+{
+ return mEps;
+}
+
+#endif
diff --git a/kscreensaver/kdesavers/rotation.cpp b/kscreensaver/kdesavers/rotation.cpp
new file mode 100644
index 00000000..38098cb0
--- /dev/null
+++ b/kscreensaver/kdesavers/rotation.cpp
@@ -0,0 +1,825 @@
+//============================================================================
+//
+// KRotation screen saver for KDE
+//
+// The screen saver displays a physically realistic simulation of a force free
+// rotating asymmetric body. The equations of motion for such a rotation, the
+// Euler equations, are integrated numerically by the Runge-Kutta method.
+//
+// Developed by Georg Drenkhahn, georg-d@users.sourceforge.net
+//
+// $Id$
+//
+/*
+ * Copyright (C) 2004 Georg Drenkhahn
+ *
+ * KRotation is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation.
+ *
+ * KRotation is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02110-1301 USA
+ */
+//============================================================================
+
+// std. C++ headers
+#include <cstdlib>
+// STL
+#include <deque>
+// Qt headers
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qvalidator.h>
+#include <qtooltip.h>
+// KDE headers
+#include <klocale.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+
+#include "sspreviewarea.h"
+
+// rotation.moc includes rotation.h
+#include "rotation.moc"
+
+/** Version number of this screen saver */
+#define KROTATION_VERSION "1.1"
+
+// libkscreensaver interface
+extern "C"
+{
+ /** application name for the libkscreensaver interface */
+ KDE_EXPORT const char *kss_applicationName = "krotation.kss";
+ /** application description for the libkscreensaver interface */
+ KDE_EXPORT const char *kss_description =
+ I18N_NOOP("Simulation of a force free rotating asymmetric body");
+ /** application version for the libkscreensaver interface */
+ KDE_EXPORT const char *kss_version = KROTATION_VERSION;
+
+ /** function to create screen saver object */
+ KDE_EXPORT KScreenSaver* kss_create(WId id)
+ {
+ return new KRotationSaver(id);
+ }
+
+ /** function to create setup dialog for screen saver */
+ KDE_EXPORT QDialog* kss_setup()
+ {
+ return new KRotationSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// EulerOdeSolver implementation
+//-----------------------------------------------------------------------------
+
+EulerOdeSolver::EulerOdeSolver(
+ const double &t_,
+ const double &dt_,
+ const double &A_,
+ const double &B_,
+ const double &C_,
+ std::valarray<double> &y_,
+ const double &eps_)
+ : RkOdeSolver<double>(t_,y_,dt_,eps_),
+ A(A_), B(B_), C(C_)
+{
+}
+
+std::valarray<double> EulerOdeSolver::f(
+ const double &x,
+ const std::valarray<double> &y) const
+{
+ // unused
+ (void)x;
+
+ // vec omega in body coor. sys.: omega_body = (p, q, r)
+ const vec3<double> omega_body(y[std::slice(0,3,1)]);
+ // body unit vectors in fixed frame coordinates
+ const vec3<double> e1(y[std::slice(3,3,1)]);
+ const vec3<double> e2(y[std::slice(6,3,1)]);
+ const vec3<double> e3(y[std::slice(9,3,1)]);
+
+ // don't use "const vec3<double>&" here because slice_array must be
+ // value-copied to vec3<double>.
+
+ // vec omega in global fixed coor. sys.
+ vec3<double> omega(
+ omega_body[0] * e1
+ + omega_body[1] * e2
+ + omega_body[2] * e3);
+
+ // return vector y'
+ std::valarray<double> ypr(y.size());
+
+ // omega_body'
+ ypr[0] = -(C-B)/A * omega_body[1] * omega_body[2]; // p'
+ ypr[1] = -(A-C)/B * omega_body[2] * omega_body[0]; // q'
+ ypr[2] = -(B-A)/C * omega_body[0] * omega_body[1]; // r'
+
+ // e1', e2', e3'
+ ypr[std::slice(3,3,1)] = vec3<double>::crossprod(omega, e1);
+ ypr[std::slice(6,3,1)] = vec3<double>::crossprod(omega, e2);
+ ypr[std::slice(9,3,1)] = vec3<double>::crossprod(omega, e3);
+
+ return ypr;
+}
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// Rotation: screen saver widget
+//-----------------------------------------------------------------------------
+
+RotationGLWidget::RotationGLWidget(
+ QWidget* parent, const char* name,
+ const vec3<double>& _omega,
+ const std::deque<vec3<double> >& e1_,
+ const std::deque<vec3<double> >& e2_,
+ const std::deque<vec3<double> >& e3_,
+ const vec3<double>& J)
+ : QGLWidget(parent, name),
+ eyeR(25), eyeTheta(1), eyePhi(M_PI*0.25),
+ boxSize(1,1,1),
+ fixedAxses(0),
+ bodyAxses(0),
+ lightR(10), lightTheta(M_PI/4), lightPhi(0),
+ bodyAxsesLength(6),
+ fixedAxsesLength(8),
+ omega(_omega),
+ e1(e1_),
+ e2(e2_),
+ e3(e3_)
+{
+ // set up initial rotation matrix as unit matrix, only non-constant elements
+ // are set later on
+ for (int i=0; i<16; i++)
+ rotmat[i] = ((i%5)==0) ? 1:0;
+
+ // Set the box sizes from the momenta of inertia. J is the 3 vector with
+ // momenta of inertia with respect to the 3 figure axes.
+
+ // the default values must be valid so that w,h,d are real!
+ GLfloat
+ x2 = 6.0*(-J[0] + J[1] + J[2]),
+ y2 = 6.0*( J[0] - J[1] + J[2]),
+ z2 = 6.0*( J[0] + J[1] - J[2]);
+
+ if (x2>=0 && y2>=0 && z2>=0)
+ {
+ boxSize = vec3<double>(sqrt(x2), sqrt(y2), sqrt(z2));
+ }
+ else
+ {
+ kdDebug() << "parameter error" << endl;
+ boxSize = vec3<double>(1, 1, 1);
+ }
+}
+
+/* --------- protected methods ----------- */
+
+void RotationGLWidget::initializeGL(void)
+{
+ qglClearColor(QColor(black)); // set color to clear the background
+
+ glClearDepth(1); // depth buffer setup
+ glEnable(GL_DEPTH_TEST); // depth testing
+ glDepthFunc(GL_LEQUAL); // type of depth test
+
+ glShadeModel(GL_SMOOTH); // smooth color shading in poygons
+
+ // nice perspective calculation
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+
+ // set up the light
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ // set positon of light0
+ GLfloat lightPos[4]=
+ {lightR * sin(lightTheta) * sin(lightPhi),
+ lightR * sin(lightTheta) * cos(lightPhi),
+ lightR * cos(lightTheta), 1.};
+ glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
+
+ // enable setting the material colour by glColor()
+ glEnable(GL_COLOR_MATERIAL);
+
+ // set up display lists
+
+ if (fixedAxses == 0)
+ fixedAxses = glGenLists(1); // list to be returned
+ glNewList(fixedAxses, GL_COMPILE);
+
+ // fixed coordinate system axes
+
+ glPushMatrix();
+ glLoadIdentity();
+
+ // z-axis, blue
+ qglColor(QColor(blue));
+ myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f);
+
+ // x-axis, red
+ qglColor(QColor(red));
+ glRotatef(90, 0, 1, 0);
+
+ myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f);
+
+ // y-axis, green
+ qglColor(QColor(green));
+ glLoadIdentity();
+ glRotatef(-90, 1, 0, 0);
+ myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f);
+
+ glPopMatrix();
+ glEndList();
+ // end of axes object list
+
+
+ // box and box-axses
+ if (bodyAxses == 0)
+ bodyAxses = glGenLists(1); // list to be returned
+ glNewList(bodyAxses, GL_COMPILE);
+
+ // z-axis, blue
+ qglColor(QColor(blue));
+ myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f);
+
+ // x-axis, red
+ qglColor(QColor(red));
+ glPushMatrix();
+ glRotatef(90, 0, 1, 0);
+ myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f);
+ glPopMatrix();
+
+ // y-axis, green
+ qglColor(QColor(green));
+ glPushMatrix();
+ glRotatef(-90, 1, 0, 0);
+ myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f);
+ glPopMatrix();
+
+ glEndList();
+}
+
+void RotationGLWidget::draw_traces(void)
+{
+ if (e1.size()==0 && e2.size()==0 && e3.size()==0)
+ return;
+
+ glPushMatrix();
+ glScalef(bodyAxsesLength, bodyAxsesLength, bodyAxsesLength);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for (int j=0; j<3; ++j)
+ {
+ const std::deque<vec3<double> >& e =
+ j==0 ? e1 : j==1 ? e2 : e3;
+
+ // trace must contain at least 2 elements
+ if (e.size() > 1)
+ {
+ // emission colour
+ GLfloat em[4] = {0,0,0,1};
+ em[j] = 1; // set either red, green, blue emission colour
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, em);
+ glColor4fv(em);
+
+ // set iterator of the tail part
+ std::deque<vec3<double> >::const_iterator eit = e.begin();
+ std::deque<vec3<double> >::const_iterator tail =
+ e.begin() +
+ static_cast<std::deque<vec3<double> >::difference_type>
+ (0.9*e.size());
+
+ glBegin(GL_LINES);
+ for (; eit < e.end()-1; ++eit)
+ {
+ glVertex3f((*eit)[0], (*eit)[1], (*eit)[2]);
+ // decrease transparency for tail section
+ if (eit > tail)
+ em[3] =
+ static_cast<GLfloat>
+ (1.0 - double(eit-tail)/(0.1*e.size()));
+ glColor4fv(em);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, em);
+ glVertex3f((*(eit+1))[0], (*(eit+1))[1], (*(eit+1))[2]);
+ }
+ glEnd();
+ }
+ }
+
+ glDisable(GL_BLEND);
+
+ glPopMatrix();
+}
+
+void RotationGLWidget::paintGL(void)
+{
+ // clear color and depth buffer
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW); // select modelview matrix
+
+ glLoadIdentity();
+ GLfloat const em[] = {0,0,0,1};
+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, em);
+
+ // omega vector
+ vec3<double> rotvec =
+ vec3<double>::crossprod(vec3<double>(0,0,1), omega).normalize();
+ GLfloat rotdeg =
+ 180./M_PI * vec3<double>::angle(vec3<double>(0,0,1), omega);
+ glPushMatrix();
+ glRotatef(rotdeg, rotvec[0], rotvec[1], rotvec[2]);
+ qglColor(QColor(white));
+ myGlArrow(7, .5f, .1f, 0.2f);
+ glPopMatrix();
+
+ // fixed axes
+ glCallList(fixedAxses);
+
+ glPushMatrix();
+
+ // set up variable part of rotation matrix for body
+ // set gl body rotation matrix from e1,e2,e3
+ const vec3<double>& e1b = e1.front();
+ const vec3<double>& e2b = e2.front();
+ const vec3<double>& e3b = e3.front();
+
+ rotmat[0] = e1b[0];
+ rotmat[1] = e1b[1];
+ rotmat[2] = e1b[2];
+ rotmat[4] = e2b[0];
+ rotmat[5] = e2b[1];
+ rotmat[6] = e2b[2];
+ rotmat[8] = e3b[0];
+ rotmat[9] = e3b[1];
+ rotmat[10] = e3b[2];
+
+ glMultMatrixf(rotmat);
+
+ glCallList(bodyAxses);
+
+ glScalef(boxSize[0]/2, boxSize[1]/2, boxSize[2]/2);
+
+ // paint box
+ glBegin(GL_QUADS);
+ // front (z)
+ qglColor(QColor(blue));
+ glNormal3f( 0,0,1);
+ glVertex3f( 1, 1, 1);
+ glVertex3f(-1, 1, 1);
+ glVertex3f(-1, -1, 1);
+ glVertex3f( 1, -1, 1);
+ // back (-z)
+ glNormal3f( 0,0,-1);
+ glVertex3f( 1, 1, -1);
+ glVertex3f(-1, 1, -1);
+ glVertex3f(-1, -1, -1);
+ glVertex3f( 1, -1, -1);
+ // top (y)
+ qglColor(QColor(green));
+ glNormal3f( 0,1,0);
+ glVertex3f( 1, 1, 1);
+ glVertex3f( 1, 1, -1);
+ glVertex3f(-1, 1, -1);
+ glVertex3f(-1, 1, 1);
+ // bottom (-y)
+ glNormal3f( 0,-1,0);
+ glVertex3f( 1, -1, 1);
+
+ glVertex3f( 1, -1, -1);
+ glVertex3f(-1, -1, -1);
+ glVertex3f(-1, -1, 1);
+ // left (-x)
+ qglColor(QColor(red));
+ glNormal3f( -1,0,0);
+ glVertex3f(-1, 1, 1);
+ glVertex3f(-1, 1, -1);
+ glVertex3f(-1, -1, -1);
+ glVertex3f(-1, -1, 1);
+ // right (x)
+ glNormal3f( 1,0,0);
+ glVertex3f( 1, 1, 1);
+ glVertex3f( 1, 1, -1);
+ glVertex3f( 1, -1, -1);
+ glVertex3f( 1, -1, 1);
+ glEnd();
+
+ // traces
+ glPopMatrix();
+ draw_traces ();
+
+ glFlush();
+}
+
+void RotationGLWidget::resizeGL(int w, int h)
+{
+ // Prevent a divide by zero
+ if (h == 0) h = 1;
+
+ // set the new view port
+ glViewport(0, 0, (GLint)w, (GLint)h);
+
+ // set up projection matrix
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ // Perspective view
+ gluPerspective(40.0f, (GLdouble)w/(GLdouble)h, 1.0, 100.0f);
+
+ // Viewing transformation, position for better view
+ // Theta is polar angle 0<Theta<Pi
+ gluLookAt(
+ eyeR * sin(eyeTheta) * sin(eyePhi),
+ eyeR * sin(eyeTheta) * cos(eyePhi),
+ eyeR * cos(eyeTheta),
+ 0,0,0,
+ 0,0,1);
+}
+
+/* --------- privat methods ----------- */
+
+void RotationGLWidget::myGlArrow(
+ GLfloat total_length, GLfloat head_length,
+ GLfloat base_width, GLfloat head_width)
+{
+ GLUquadricObj* quadAx = gluNewQuadric();
+ glPushMatrix();
+ gluCylinder(quadAx, base_width, base_width,
+ total_length-head_length, 10, 1);
+ glTranslatef(0, 0, total_length-head_length);
+ gluCylinder(quadAx, head_width, 0, head_length, 10, 1);
+ glPopMatrix();
+ gluDeleteQuadric(quadAx);
+}
+
+
+//-----------------------------------------------------------------------------
+// KRotationSaver: screen saver class
+//-----------------------------------------------------------------------------
+
+KRotationSaver::KRotationSaver(WId id)
+ : KScreenSaver(id),
+ J(4,2,3), // fixed box sizes!
+ initEulerPhi(0),
+ initEulerPsi(0),
+ solver(0),
+ glArea(0),
+ timer(0),
+ m_traceLengthSeconds(traceLengthSecondsDefault),
+ m_Lz(LzDefault),
+ m_initEulerTheta(initEulerThetaDefault)
+{
+ readSettings(); // read global settings
+ initData(); // init e1,e2,e3,omega,solver
+
+ setEraseColor(black);
+ erase(); // erase area
+ glArea = new RotationGLWidget(
+ this, 0, omega, e1, e2, e3, J); // create gl widget
+ embed(glArea); // embed gl widget and resize it
+ glArea->show(); // show gl widget
+
+ timer = new QTimer(this);
+ timer->start(deltaT, TRUE);
+ connect(timer, SIGNAL(timeout()), this, SLOT(doTimeStep()));
+}
+
+KRotationSaver::~KRotationSaver()
+{
+ // time, rotation are automatically deleted with parent KRotationSaver
+ delete solver;
+}
+
+void KRotationSaver::initData()
+{
+ // reset coordiante system
+ vec3<double> e1t(1,0,0), e2t(0,1,0), e3t(0,0,1);
+ // rotation by phi around z = zhat axis
+ e1t.rotate(initEulerPhi*e3t);
+ e2t.rotate(initEulerPhi*e3t);
+ // rotation by theta around new x axis
+ e2t.rotate(m_initEulerTheta*e1t);
+ e3t.rotate(m_initEulerTheta*e1t);
+ // rotation by psi around new z axis
+ e1t.rotate(initEulerPsi*e3t);
+ e2t.rotate(initEulerPsi*e3t);
+ // set first vector in deque
+ e1.clear(); e1.push_front(e1t);
+ e2.clear(); e2.push_front(e2t);
+ e3.clear(); e3.push_front(e3t);
+
+ // calc L in body frame: 1. determine z-axis of fixed frame in body
+ // coordinates, undo the transformations for unit z vector of the body frame
+
+ // calc omega_body from ...
+ vec3<double> e1_body(1,0,0), e3_body(0,0,1);
+ // rotation by -psi along z axis
+ e1_body.rotate(-initEulerPsi*e3_body);
+ // rotation by -theta along new x axis
+ e3_body.rotate(-m_initEulerTheta*e1_body);
+ // omega_body = L_body * J_body^(-1)
+ vec3<double> omega_body = e3_body * m_Lz;
+ omega_body /= J;
+
+ // assemble initial y for solver
+ std::valarray<double> y(12);
+ y[std::slice(0,3,1)] = omega_body;
+ // 3 basis vectors of body system in fixed coordinates
+ y[std::slice(3,3,1)] = e1t;
+ y[std::slice(6,3,1)] = e2t;
+ y[std::slice(9,3,1)] = e3t;
+
+ // initial rotation vector
+ omega
+ = omega_body[0]*e1t
+ + omega_body[1]*e2t
+ + omega_body[2]*e3t;
+
+ if (solver!=0) delete solver;
+ // init solver
+ solver = new EulerOdeSolver(
+ 0.0, // t
+ 0.01, // first dt step size estimation
+ J[0], J[1], J[2], // A,B,C
+ y, // omega_body,e1,e2,e3
+ 1e-5); // eps
+}
+
+void KRotationSaver::readSettings()
+{
+ // read configuration settings from config file
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+
+ // internal saver parameters are set to stored values or left at their
+ // default values if stored values are out of range
+ setTraceFlag(0, config->readBoolEntry("x trace", traceFlagDefault[0]));
+ setTraceFlag(1, config->readBoolEntry("y trace", traceFlagDefault[1]));
+ setTraceFlag(2, config->readBoolEntry("z trace", traceFlagDefault[2]));
+ setRandomTraces(config->readBoolEntry("random traces", randomTracesDefault));
+ setTraceLengthSeconds(
+ config->readDoubleNumEntry("length", traceLengthSecondsDefault));
+ setLz(
+ config->readDoubleNumEntry("Lz", LzDefault));
+ setInitEulerTheta(
+ config->readDoubleNumEntry("theta", initEulerThetaDefault));
+}
+
+void KRotationSaver::setTraceLengthSeconds(const double& t)
+{
+ if (t >= traceLengthSecondsLimitLower
+ && t <= traceLengthSecondsLimitUpper)
+ {
+ m_traceLengthSeconds = t;
+ }
+}
+
+const double KRotationSaver::traceLengthSecondsLimitLower = 0.0;
+const double KRotationSaver::traceLengthSecondsLimitUpper = 99.0;
+const double KRotationSaver::traceLengthSecondsDefault = 3.0;
+
+const bool KRotationSaver::traceFlagDefault[3] = {false, false, true};
+
+void KRotationSaver::setLz(const double& Lz)
+{
+ if (Lz >= LzLimitLower && Lz <= LzLimitUpper)
+ {
+ m_Lz = Lz;
+ }
+}
+
+const double KRotationSaver::LzLimitLower = 0.0;
+const double KRotationSaver::LzLimitUpper = 500.0;
+const double KRotationSaver::LzDefault = 10.0;
+
+void KRotationSaver::setInitEulerTheta(const double& theta)
+{
+ if (theta >= initEulerThetaLimitLower
+ && theta <= initEulerThetaLimitUpper)
+ {
+ m_initEulerTheta = theta;
+ }
+}
+
+const double KRotationSaver::initEulerThetaLimitLower = 0.0;
+const double KRotationSaver::initEulerThetaLimitUpper = 180.0;
+const double KRotationSaver::initEulerThetaDefault = 0.03;
+
+// public slots
+
+void KRotationSaver::doTimeStep()
+{
+ // integrate a step ahead
+ solver->integrate(0.001*deltaT);
+
+ // read new y
+ std::valarray<double> y = solver->Y();
+
+ std::deque<vec3<double> >::size_type
+ max_vec_length =
+ static_cast<std::deque<vec3<double> >::size_type>
+ ( m_traceLengthSeconds/(0.001*deltaT) );
+
+ for (int j=0; j<3; ++j)
+ {
+ std::deque<vec3<double> >& e =
+ j==0 ? e1 :
+ j==1 ? e2 : e3;
+
+ // read out new body coordinate system
+ if (m_traceFlag[j] == true
+ && max_vec_length > 0)
+ {
+ e.push_front(y[std::slice(3*j+3, 3, 1)]);
+ while (e.size() > max_vec_length)
+ {
+ e.pop_back();
+ }
+ }
+ else
+ {
+ // only set the 1. element
+ e.front() = y[std::slice(3*j+3, 3, 1)];
+ // and delete all other emements
+ if (e.size() > 1)
+ e.resize(1);
+ }
+ }
+
+ // current rotation vector omega
+ omega = y[0]*e1.front() + y[1]*e2.front() + y[2]*e3.front();
+
+ // set new random traces every 10 seconds
+ if (m_randomTraces==true)
+ {
+ static unsigned int counter=0;
+ ++counter;
+ if (counter > unsigned(10.0/(0.001*deltaT)))
+ {
+ counter=0;
+ for (int i=0; i<3; ++i)
+ m_traceFlag[i] = rand()%2==1 ? true : false;
+ }
+ }
+
+ glArea->updateGL();
+ timer->start(deltaT, TRUE); // restart timer
+}
+
+// public slot of KRotationSaver, forward resize event to public slot of glArea
+// to allow the resizing of the gl area withing the setup dialog
+void KRotationSaver::resizeGlArea(QResizeEvent* e)
+{
+ glArea->resize(e->size());
+}
+
+//-----------------------------------------------------------------------------
+// KRotationSetup: dialog to setup screen saver parameters
+//-----------------------------------------------------------------------------
+
+KRotationSetup::KRotationSetup(QWidget* parent, const char* name)
+ : KRotationSetupUi(parent, name),
+ // create ssaver and give it the WinID of the preview area
+ saver(new KRotationSaver(preview->winId()))
+{
+ // the dialog should block, no other control center input should be possible
+ // until the dialog is closed
+ setModal(TRUE);
+
+ lengthEdit->setValidator(
+ new QDoubleValidator(
+ KRotationSaver::traceLengthSecondsLimitLower,
+ KRotationSaver::traceLengthSecondsLimitUpper,
+ 3, lengthEdit));
+ LzEdit->setValidator(
+ new QDoubleValidator(
+ KRotationSaver::LzLimitLower,
+ KRotationSaver::LzLimitUpper,
+ 3, LzEdit));
+ thetaEdit->setValidator(
+ new QDoubleValidator(
+ KRotationSaver::initEulerThetaLimitLower,
+ KRotationSaver::initEulerThetaLimitUpper,
+ 3, thetaEdit));
+
+ // set tool tips of editable fields
+ QToolTip::add(
+ lengthEdit,
+ i18n("Length of traces in seconds of visibility.\nValid values from %1 to %2.")
+ .arg(KRotationSaver::traceLengthSecondsLimitLower, 0, 'f', 2)
+ .arg(KRotationSaver::traceLengthSecondsLimitUpper, 0, 'f', 2));
+ QToolTip::add(
+ LzEdit,
+ i18n("Angular momentum in z direction in arbitrary units.\nValid values from %1 to %2.")
+ .arg(KRotationSaver::LzLimitLower, 0, 'f', 2)
+ .arg(KRotationSaver::LzLimitUpper, 0, 'f', 2));
+ QToolTip::add(
+ thetaEdit,
+ i18n("Gravitational constant in arbitrary units.\nValid values from %1 to %2.")
+ .arg(KRotationSaver::initEulerThetaLimitLower, 0, 'f', 2)
+ .arg(KRotationSaver::initEulerThetaLimitUpper, 0, 'f', 2));
+
+ // init preview area
+ preview->setBackgroundColor(black);
+ preview->show(); // otherwise saver does not get correct size
+
+ // read settings from saver and update GUI elements with these values, saver
+ // has read settings in its constructor
+
+ // set editable fields with stored values as defaults
+ xTrace->setChecked(saver->traceFlag(0));
+ yTrace->setChecked(saver->traceFlag(1));
+ zTrace->setChecked(saver->traceFlag(2));
+ randTraces->setChecked(saver->randomTraces());
+ QString text;
+ text.setNum(saver->traceLengthSeconds());
+ lengthEdit->validateAndSet(text,0,0,0);
+ text.setNum(saver->Lz());
+ LzEdit->validateAndSet(text,0,0,0);
+ text.setNum(saver->initEulerTheta());
+ thetaEdit->validateAndSet(text,0,0,0);
+
+ // if the preview area is resized it emmits the resized() event which is
+ // caught by the saver. The embedded GlArea is resized to fit into the
+ // preview area.
+ connect(preview, SIGNAL(resized(QResizeEvent*)),
+ saver, SLOT(resizeGlArea(QResizeEvent*)));
+}
+
+KRotationSetup::~KRotationSetup()
+{
+ delete saver;
+}
+
+// Ok pressed - save settings and exit
+void KRotationSetup::okButtonClickedSlot(void)
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+ config->writeEntry("x trace", saver->traceFlag(0));
+ config->writeEntry("y trace", saver->traceFlag(1));
+ config->writeEntry("z trace", saver->traceFlag(2));
+ config->writeEntry("random traces", saver->randomTraces());
+ config->writeEntry("length", saver->traceLengthSeconds());
+ config->writeEntry("Lz", saver->Lz());
+ config->writeEntry("theta", saver->initEulerTheta());
+ config->sync();
+ accept();
+}
+
+void KRotationSetup::aboutButtonClickedSlot(void)
+{
+ KMessageBox::about(this, i18n("\
+<h3>KRotation Screen Saver for KDE</h3>\
+<p>Simulation of a force free rotating asymmetric body</p>\
+<p>Copyright (c) Georg&nbsp;Drenkhahn 2004</p>\
+<p><tt>georg-d@users.sourceforge.net</tt></p>"));
+}
+
+void KRotationSetup::xTraceToggled(bool state)
+{
+ saver->setTraceFlag(0, state);
+}
+void KRotationSetup::yTraceToggled(bool state)
+{
+ saver->setTraceFlag(1, state);
+}
+void KRotationSetup::zTraceToggled(bool state)
+{
+ saver->setTraceFlag(2, state);
+}
+void KRotationSetup::randomTracesToggled(bool state)
+{
+ saver->setRandomTraces(state);
+ if (state==false)
+ {
+ // restore settings from gui if random traces are turned off
+ saver->setTraceFlag(0, xTrace->isChecked());
+ saver->setTraceFlag(1, yTrace->isChecked());
+ saver->setTraceFlag(2, zTrace->isChecked());
+ }
+}
+void KRotationSetup::lengthEnteredSlot(const QString& s)
+{
+ saver->setTraceLengthSeconds(s.toDouble());
+}
+void KRotationSetup::LzEnteredSlot(const QString& s)
+{
+ saver->setLz(s.toDouble());
+ if (saver!=0) saver->initData();
+}
+void KRotationSetup::thetaEnteredSlot(const QString& s)
+{
+ saver->setInitEulerTheta(s.toDouble());
+ if (saver!=0) saver->initData();
+}
diff --git a/kscreensaver/kdesavers/rotation.h b/kscreensaver/kdesavers/rotation.h
new file mode 100644
index 00000000..a1a73867
--- /dev/null
+++ b/kscreensaver/kdesavers/rotation.h
@@ -0,0 +1,325 @@
+//============================================================================
+//
+// KRotation screen saver for KDE
+// Copyright (C) 2004 Georg Drenkhahn
+// $Id$
+//
+//============================================================================
+
+#ifndef __ROTATION_H__
+#define __ROTATION_H__
+
+#include <math.h>
+// STL headers
+#include <valarray>
+// Qt headers
+#include <qwidget.h>
+#include <qtimer.h>
+#include <qgl.h>
+// GL headers
+#include <GL/glu.h>
+#include <GL/gl.h>
+// KDE headers
+#include <kscreensaver.h>
+
+#include "vec3.h"
+#include "rkodesolver.h"
+
+// KRotationSetupUi
+#include "rotationcfg.h"
+
+//--------------------------------------------------------------------
+
+/** @brief ODE solver for the Euler equations.
+ *
+ * Class implements RkOdeSolver<double> to solve the Euler equations of motion
+ * tor the rotating object. */
+class EulerOdeSolver : public RkOdeSolver<double>
+{
+ public:
+ /** @brief Constructor for the ODE solver for the Euler equations.
+ * @param t Time in seconds, integration variable
+ * @param dt Initial time increment in seconds for integration, auto adjusted
+ * later to guarantee precision
+ * @param _A Moment of inertia along 1. figure axis
+ * @param _B Moment of inertia along 2. figure axis
+ * @param _C Moment of inertia along 3. figure axis
+ * @param _y Vector of 12 elements containing the initial rotation vector
+ * omega (elements 0 to 2), and the initial rotating systems coordinate
+ * vectors e1, e2, e3 (elements 3 to 5, 6 to 8, and 9 to 11).
+ * @param eps Relative precision per integration step, see
+ * RkOdeSolver::RkOdeSolver(). */
+ EulerOdeSolver(
+ const double &t_,
+ const double &dt_,
+ const double &A_,
+ const double &B_,
+ const double &C_,
+ std::valarray<double> &y_,
+ const double &eps);
+
+ protected:
+ /** @brief ODE function for the Euler equation system
+ * @param x time in seconds
+ * @param y Vector of 12 elements containing the rotation vector omega
+ * (elements 0 to 2), and the rotating systems coordinate vectors e1, e2, e3
+ * (elements 3 to 5, 6 to 8, and 9 to 11).
+ * @return derivation dy/dx */
+ std::valarray<double>
+ f(const double &x, const std::valarray<double> &y) const;
+
+ private:
+ /** Moments of inertia along the three figure axes */
+ double A, B, C;
+};
+
+
+//--------------------------------------------------------------------
+
+/** @brief GL widget class for the KRotation screen saver
+ *
+ * Class implements QGLWidget to display the KRotation screen saver. */
+class RotationGLWidget : public QGLWidget
+{
+ Q_OBJECT
+
+ public:
+ /** @brief Constructor of KRotation's GL widget
+ * @param parent parent widget, passed to QGLWidget's constructor
+ * @param name name of widget, passed to QGLWidget's constructor
+ * @param omega current rotation vector
+ * @param e1 x trace data
+ * @param e2 y trace data
+ * @param e3 z trace data
+ * @param J 3 vector with momenta of inertia with respect to the 3 figure
+ * axes. */
+ RotationGLWidget(QWidget* parent, const char* name,
+ const vec3<double>& omega,
+ const std::deque<vec3<double> >& e1,
+ const std::deque<vec3<double> >& e2,
+ const std::deque<vec3<double> >& e3,
+ const vec3<double>& J);
+
+ protected:
+ /** Called if scenery (GL view) must be updated */
+ virtual void paintGL();
+ /** Called if gl widget was resized. Method makes adjustments for new
+ * perspective */
+ virtual void resizeGL(int w, int h);
+ /** Setup the GL enviroment */
+ virtual void initializeGL();
+
+ private:
+ /** @brief Draw 3D arrow
+ * @param total_length total length of arrow
+ * @param head_length length of arrow head (cone)
+ * @param base_width width of arrow base
+ * @param head_width width of arrow head (cone)
+ *
+ * The arrow is drawn from the coordinates zero point along th z direction.
+ * The cone's tip is located at (0,0,@a total_length). */
+ void myGlArrow(GLfloat total_length, GLfloat head_length,
+ GLfloat base_width, GLfloat head_width);
+ /** Draw the traces in the GL area */
+ void draw_traces (void);
+
+ private: // Private attributes
+ /** Eye position distance from coordinate zero point */
+ GLfloat eyeR;
+ /** Eye position theta angle from z axis */
+ GLfloat eyeTheta;
+ /** Eye position phi angle (longitude) */
+ GLfloat eyePhi;
+ /** Box size */
+ vec3<double> boxSize;
+ /** GL object list of fixed coordinate systems axses */
+ GLuint fixedAxses;
+ /** GL object list of rotating coordinate systems axses */
+ GLuint bodyAxses;
+ /** Light position distance from coordinate zero point */
+ GLfloat lightR;
+ /** Light position theta angle from z axis */
+ GLfloat lightTheta;
+ /** Light position phi angle (longitude) */
+ GLfloat lightPhi;
+
+ /** stores position where the mouse button was pressed down */
+ QPoint mouse_press_pos;
+
+ /** Length of the rotating coordinate system axses */
+ GLfloat bodyAxsesLength;
+ /** Length of the fixed coordinate system axses */
+ GLfloat fixedAxsesLength;
+
+ /** The openGL rotation matrix for the box. */
+ GLfloat rotmat[16];
+
+ /** reference to current rotation vector */
+ const vec3<double>& omega;
+ /** reference to x trace values */
+ const std::deque<vec3<double> >& e1;
+ /** reference to y trace values */
+ const std::deque<vec3<double> >& e2;
+ /** reference to z trace values */
+ const std::deque<vec3<double> >& e3;
+};
+
+//--------------------------------------------------------------------
+
+/** @brief Main class of the KRotation screen saver
+ *
+ * This class implements KScreenSaver for the KRotation screen saver. */
+class KRotationSaver : public KScreenSaver
+{
+ Q_OBJECT
+
+ public:
+ /** @brief Constructor of the KRotation screen saver object
+ * @param drawable Id of the window in which the screen saver is drawed
+ *
+ * Initial settings are read from disk, the GL widget is set up and displayed
+ * and the eq. of motion solver is started. */
+ KRotationSaver(WId drawable);
+ /** @brief Destructor of the KPendulum screen saver object
+ *
+ * Only KPendulumSaver::solver is destoyed. */
+ ~KRotationSaver();
+ /** read the saved settings from disk */
+ void readSettings();
+ /** init physical quantities and set up the ode solver */
+ void initData();
+
+ /** Returns length of traces in seconds of visibility, parameter from setup
+ * dialog */
+ inline double traceLengthSeconds(void) const {return m_traceLengthSeconds;}
+ /** Sets the length of traces in seconds of visibility. */
+ void setTraceLengthSeconds(const double& t);
+ /** Lower argument limit for setTraceLengthSeconds() */
+ static const double traceLengthSecondsLimitLower;
+ /** Upper argument limit for setTraceLengthSeconds() */
+ static const double traceLengthSecondsLimitUpper;
+ /** Default value of KRotationSaver::m_traceLengthSeconds */
+ static const double traceLengthSecondsDefault;
+
+ /** Flags indicating if the traces for x,y,z are shown. Only relevant if
+ * ::randomTraces is not set to true. Parameter from setup dialog */
+ inline bool traceFlag(unsigned int n) const {return m_traceFlag[n];}
+ /** (Un)Sets the x,y,z traces flags. */
+ inline void setTraceFlag(unsigned int n, const bool& flag)
+ {m_traceFlag[n] = flag;}
+ /** Default values for KRotationSaver::m_traceFlag */
+ static const bool traceFlagDefault[3];
+
+ /** If flag is set to true the traces will be (de)activated randomly all 10
+ * seconds. Parameter from setup dialog */
+ inline bool randomTraces(void) const {return m_randomTraces;}
+ /** (Un)Sets the random trace flag. */
+ inline void setRandomTraces(const bool& flag) {m_randomTraces = flag;}
+ /** Default value for KRotationSaver::m_randomTraces */
+ static const bool randomTracesDefault = true;
+
+ /** Returns the angular momentum. */
+ inline double Lz(void) const {return m_Lz;}
+ /** Sets the angular momentum. */
+ void setLz(const double& Lz);
+ /** Lower argument limit for setLz() */
+ static const double LzLimitLower;
+ /** Upper argument limit for setLz() */
+ static const double LzLimitUpper;
+ /** Default value for KRotationSaver::m_Lz */
+ static const double LzDefault;
+
+ /** Returns initial eulerian angle theta of the top body at t=0 sec. */
+ inline double initEulerTheta(void) const {return m_initEulerTheta;}
+ /** Set the initial eulerian angle theta of the top body at t=0 sec. */
+ void setInitEulerTheta(const double& theta);
+ /** Lower argument limit for setInitEulerTheta() */
+ static const double initEulerThetaLimitLower;
+ /** Upper argument limit for setInitEulerTheta() */
+ static const double initEulerThetaLimitUpper;
+ /** Default value for KRotationSaver::m_initEulerTheta */
+ static const double initEulerThetaDefault;
+
+ public slots:
+ /** slot is called if integration should proceed by ::deltaT */
+ void doTimeStep();
+ /** slot is called if setup dialog changes in size and the GL area should be
+ * adjusted */
+ void resizeGlArea(QResizeEvent* e);
+
+ private:
+ /** Momentum of inertia along figure axes */
+ vec3<double> J;
+ /** Initial eulerian angles phi of the top body at t=0s */
+ double initEulerPhi;
+ /** Initial eulerian angles psi of the top body at t=0s */
+ double initEulerPsi;
+
+ /** The ode solver which is used to integrate the equations of motion */
+ EulerOdeSolver* solver;
+ /** Gl widget of simulation */
+ RotationGLWidget* glArea;
+ /** Timer for the real time integration of the Euler equations */
+ QTimer* timer;
+
+ /** current rotation vector */
+ vec3<double> omega;
+ /** deque of unit vectors of e1 figure axes in fixed frame coordinates */
+ std::deque<vec3<double> > e1;
+ /** deque of unit vectors of e2 figure axes in fixed frame coordinates */
+ std::deque<vec3<double> > e2;
+ /** deque of unit vectors of e3 figure axes in fixed frame coordinates */
+ std::deque<vec3<double> > e3;
+
+ /** Time step size for the integration in milliseconds. Used in
+ * ::KRotationSaver and ::RotationGLWidget. */
+ static const unsigned int deltaT = 20;
+
+ /** Length of traces in seconds of visibility, parameter from setup dialog */
+ double m_traceLengthSeconds;
+ /** Flags indicating if the traces for x,y,z are shown. Only relevant if
+ * ::randomTraces is not set to true. Parameter from setup dialog */
+ bool m_traceFlag[3];
+ /** If flag is set to true the traces will be (de)activated randomly all 10
+ * seconds. Parameter from setup dialog */
+ bool m_randomTraces;
+ /** Angular momentum. This is a constant of motion and points always into
+ * positive z direction. Parameter from setup dialog */
+ double m_Lz;
+ /** Initial eulerian angles theta of the top body at t=0 sec. Parameter from
+ * setup dialog */
+ double m_initEulerTheta;
+};
+
+//--------------------------------------------------------------------
+
+/** @brief KRotation screen saver setup dialog.
+ *
+ * This class handles the KRotation screen saver setup dialog. */
+class KRotationSetup : public KRotationSetupUi
+{
+ Q_OBJECT
+
+ public:
+ KRotationSetup(QWidget* parent = NULL, const char* name = NULL);
+ ~KRotationSetup();
+
+ public slots:
+ /// slot for the OK Button: save settings and exit
+ void okButtonClickedSlot(void);
+ /// slot for the About Button: show the About dialog
+ void aboutButtonClickedSlot(void);
+ void randomTracesToggled(bool state);
+ void xTraceToggled(bool state);
+ void yTraceToggled(bool state);
+ void zTraceToggled(bool state);
+ void lengthEnteredSlot(const QString& s);
+ void LzEnteredSlot(const QString& s);
+ void thetaEnteredSlot(const QString& s);
+
+ private:
+ /// the screen saver widget which is displayed in the preview area
+ KRotationSaver* saver;
+};
+
+#endif
diff --git a/kscreensaver/kdesavers/rotationcfg.ui b/kscreensaver/kdesavers/rotationcfg.ui
new file mode 100644
index 00000000..d7e95d3b
--- /dev/null
+++ b/kscreensaver/kdesavers/rotationcfg.ui
@@ -0,0 +1,488 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KRotationSetupUi</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KRotationSetupUi</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>401</width>
+ <height>265</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>1200</width>
+ <height>900</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>400</width>
+ <height>250</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>KRotation Setup</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>Minimum</enum>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout17</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Traces</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>xTrace</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>x</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>randTraces</cstring>
+ </property>
+ <property name="text">
+ <string>Random</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>yTrace</cstring>
+ </property>
+ <property name="text">
+ <string>y</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="2">
+ <property name="name">
+ <cstring>zTrace</cstring>
+ </property>
+ <property name="text">
+ <string>z</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Length:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>lengthEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Helvetica</family>
+ <pointsize>11</pointsize>
+ </font>
+ </property>
+ <property name="maxLength">
+ <number>2</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>LzEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>50</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxLength">
+ <number>5</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Theta:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Lz:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>thetaEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>50</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxLength">
+ <number>5</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="SsPreviewArea">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>200</width>
+ <height>150</height>
+ </size>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>51</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>OkButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>CancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>AboutButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;About</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>61</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>SsPreviewArea</class>
+ <header location="global">sspreviewarea.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4462">789c9d97c76e24490e86effd1442f3d65870d2451a0ce6206f5adeb4cc620f8c34f2553225b5a4c1befb46927fe6a1d4c0ccac4287fa8a0c26834193f5dbb785b3fd9d856fbf7d799ec9ecba5ea8afe469e15bf3727ffffeeffffcf1e797af49b2d0ffc7d142f2f55f5fbe1ecc16ea85dde9a4ed81290045faa77ca49cf4ab67ba1e3953969173651ab9d4fdf1c8a27c3872ad7c3c72d3b32c2a67c3f3444636fbef23eb7e590267e68fcc4656395d8dacf6d938ef97eaef289781cddebdb2846fccff44b989ba58e3411f3dc75158e6df1d3889539517ca49bf54fe43398d1dec4f46567f685fd9c539f43fc025f80c1c3ce8d93f28e77185f8bf0c6cfae4c0b5f9c3c6e5c0542a4b5876fe13708df39d2bd7716372aa8c93c4e4723bb2f977aadc26ceec4bdb7310e6b0bfab9c2445ecd49f1370694cebca65d260ffa6711a41aef14d24e94cee6be3348e0ae5e9c8765f07ca3e8db17f0f9c825794eb3489351fe9bb7217e4969f29388bd51ee9fda5715a19730696b852fea95c6471647ca95cf64bcf43e0cef4657b647bfe6acf213d6bb32f9a9f5992b5a64f9a8f990b6cf9ecc15d6cf9acf6b2da55a8a75cb973dee4b2d1b38b5c05de02434e87e01aacfb351df5bebddea74b5c67f9c795711ea15e357e2ecde358fb87efc0a867df8cac728a074e62e527706afb59f3cf6583be5c28bb3c35f693812d1fbdc6dbe57966fec932d899ffa4f7e38adca17e34beaeca4b9c271a18f1d5fc739257b0d70d9c68be7bed7fcee7827ab91cd8e4740cf6b19d4ffb87ab07b9bf516e72d4a3ac821b9cef6e60d84f47367ded2fae1d9f7704f6163f79000ffde27660f387ed3c5dbf54dfeebb0bf6acbe6b706bfa5ef32f8f8b18f5bf0f463f20edb77956a4e68fbc80b3c4facd163847be6bfde72ec86dbeac82715fbc0286be683cf3bc081d44f7df80d344fb0b6b7de64581fb916765297263d6fccd9b7ee97e566e8b06cfdb1f59cf2bda2f8bbc2c11df0c5c41aefdb328ca22b1feb0012eedbce24736f91b18fb796d64eb87cb60817dcdafb07d906bfd14d22f659d8785ef97b2f6d7b2df6ef1d6fb2babaac6f92e8c25b27ecc1f239b7f3a5fca5a8678ea7c2d9bc0e6ef1238b3fca2c7814d5f4cbf9334b5f833384bed3c7a5f5514f4adbe2ec07962e7590457f06f6f649b977afe2a16f42f5e070bfc591e18f7a5f1a812a9e0df39d827da4fbd8c6ccfd7785569bf945f953371a9d5a3de67950bfa2d75c63eb2fb15bdcfaaf011e6c7263846bf8f4636f91618f3c7d3c0f047fb69550efab2074e12bd6fd27957553ec33c5b043bcc7f9d0795f818fdb501a3df8ae673e507ff69021eea37063bc45ffb73550736ff36c0a84f3e0317a86f8b5f139e6ffe1f821de6d9127898ff3be00a7c3ab2cd03e3d697560ff40016e47b3bb2e96bbd559d8f32bbff4b7065f193042c98873acf240af6adbf3c83c5f2954bb0c7bcd77c107d81d2fdebc63e33ff640aaecc9e1c8151df5c803dfaadc64b52dfa03ed64636ffb4ff4b2867f453ede7227586fcd3f9264ded91fffafe236d5da37fe83c91ceb7b9e5b7f6731ff92ed7f747d6fbf7e185cf58347e3e6932e47b3430fa893edf87d795c2fc3f003b67f5f902cec17abfde0dfa3c053b3c5ffb832fc2eb8fddcf233887fc195c801f46b6f3cdc02558fba72f7d2d1a7f7e321ee58fe0cad86bbff24dd3e2fe74fef836b0c6eb60d62fa6bf5e07b3419f853dd7dc70fb8bd5f1255fd90ed30f9f3c5ff30ddff21ddff384a7fcc08ffcc4cf61cdf8855ff9e79c7e1db4dff89d3f7891977899577895d7789d377893b7f83b6fcfe937bc13b477798ff7f9800ff928ac633ee11f7cca6761d7f99c7e1b3cb908da11c7413be1943376e153cc39175c72f549ff9e17c31744429e6a6aa8a58e2ee98aaee9866e7f617fc24b7417a4f734a1293dd0233dd133cd8285177aa5f9f3b63ca5377aa78f607b919668995682e62aadd17ab0b1419b9ff41f682b48bed336edd02eed05ed7d5ea3033a0cdf1ed1f127fd273ae123fa41a774a6b685cee982228a837e42e927fd47caf8985c38651eb40b2ac38e4a5842658a97fab33fd248cb87d2c9a55cc9b5dcc82d1fc99ddccb44a6f230af2f8ff224cf417f262ff22a3fe54ddee543166549966545567f617f4dd66523dc6b2c9bb225df655b7682f692ecca9eeccfe97772c09b722847722c27c1f3eb70f66bf9116c9fca999ccbc59cfe25bf4a143a5ef8992561324a78bd92522acf9ebc78efe7cf7b153276db37bef59dbff457fedadff85b7f27abfede4ffcd4cf9ff76faeff4fffefeff8c7f5fedfdfbffc0fa355c495</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>OkButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>okButtonClickedSlot()</slot>
+ </connection>
+ <connection>
+ <sender>CancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>AboutButton</sender>
+ <signal>clicked()</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>aboutButtonClickedSlot()</slot>
+ </connection>
+ <connection>
+ <sender>randTraces</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>xTrace</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>xTrace</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>xTraceToggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>randTraces</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>yTrace</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>randTraces</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>zTrace</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>randTraces</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>randomTracesToggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>yTrace</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>yTraceToggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>zTrace</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>zTraceToggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>lengthEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>lengthEnteredSlot(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>LzEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>LzEnteredSlot(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>thetaEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>KRotationSetupUi</receiver>
+ <slot>thetaEnteredSlot(const QString&amp;)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>okButtonClickedSlot()</slot>
+ <slot>aboutButtonClickedSlot()</slot>
+ <slot>randomTracesToggled(bool)</slot>
+ <slot>xTraceToggled(bool)</slot>
+ <slot>yTraceToggled(bool)</slot>
+ <slot>zTraceToggled(bool)</slot>
+ <slot>lengthEnteredSlot(const QString&amp;)</slot>
+ <slot>LzEnteredSlot(const QString&amp;)</slot>
+ <slot>thetaEnteredSlot(const QString&amp;)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>sspreviewarea.h</includehint>
+</includehints>
+</UI>
diff --git a/kscreensaver/kdesavers/science.cpp b/kscreensaver/kdesavers/science.cpp
new file mode 100644
index 00000000..185f3b55
--- /dev/null
+++ b/kscreensaver/kdesavers/science.cpp
@@ -0,0 +1,1151 @@
+//-----------------------------------------------------------------------------
+//
+// kscience - screen saver for KDE
+//
+// Copyright (c) Rene Beutler 1998
+//
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <sys/types.h>
+#include <time.h>
+
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qlabel.h>
+#include <qlistbox.h>
+#include <qcheckbox.h>
+#include <qslider.h>
+#include <qlayout.h>
+
+#include <kapplication.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kstandarddirs.h>
+#include <krandomsequence.h>
+
+#include "science.h"
+#include "science.moc"
+
+#if defined Q_WS_X11 && !defined K_WS_QTONLY
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif
+
+#define SCI_DEFAULT_MODE 0
+#define SCI_DEFAULT_MOVEX 6
+#define SCI_DEFAULT_MOVEY 8
+#define SCI_DEFAULT_SIZE 15
+#define SCI_DEFAULT_INTENSITY 4
+#define SCI_DEFAULT_SPEED 70
+#define SCI_DEFAULT_INVERSE false
+#define SCI_DEFAULT_GRAVITY false
+#define SCI_DEFAULT_HIDE false
+#define SCI_MAX_SPEED 100
+#define SCI_MAX_MOVE 20
+
+#undef Below
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kscience.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Science Screen Saver" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KScienceSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KScienceSetup();
+ }
+}
+
+static struct {
+ QString name;
+ bool inverseEnable;
+ } modeInfo[MAX_MODES];
+
+enum { MODE_WHIRL=0, MODE_CURVATURE, MODE_SPHERE, MODE_WAVE, MODE_EXPONENTIAL, MODE_CONTRACTION };
+
+void initModeInfo()
+{
+ modeInfo[MODE_WHIRL].name = i18n( "Whirl" );
+ modeInfo[MODE_WHIRL].inverseEnable = true;
+
+ modeInfo[MODE_SPHERE].name = i18n( "Sphere" );
+ modeInfo[MODE_SPHERE].inverseEnable = true;
+
+ modeInfo[MODE_EXPONENTIAL].name = i18n( "Exponential" );
+ modeInfo[MODE_EXPONENTIAL].inverseEnable = false;
+
+ modeInfo[MODE_CONTRACTION].name = i18n( "Contraction" );
+ modeInfo[MODE_CONTRACTION].inverseEnable = false;
+
+ modeInfo[MODE_WAVE].name = i18n( "Wave" );
+ modeInfo[MODE_WAVE].inverseEnable = false;
+
+ modeInfo[MODE_CURVATURE].name = i18n( "Curvature" );
+ modeInfo[MODE_CURVATURE].inverseEnable = true;
+}
+
+//-----------------------------------------------------------------------------
+// KPreviewWidget
+//
+
+KPreviewWidget::KPreviewWidget( QWidget *parent ) :
+ QWidget ( parent ) { }
+
+void KPreviewWidget::paintEvent( QPaintEvent *event )
+{
+ if( saver != 0 )
+ saver->do_refresh( event->rect() );
+}
+
+void KPreviewWidget::notifySaver( KScienceSaver *s )
+{
+ saver = s;
+}
+
+//-----------------------------------------------------------------------------
+// Screen Saver
+//
+
+struct KScienceData
+{
+ T32bit **offset;
+ XImage *buffer;
+ XImage *xRootWin;
+ GC gc;
+};
+
+KScienceSaver::KScienceSaver( WId id, bool s, bool gP )
+ : KScreenSaver( id )
+{
+ d = new KScienceData;
+ d->gc = XCreateGC(qt_xdisplay(), id, 0, 0);
+ d->xRootWin = 0;
+ d->buffer = 0;
+
+ moveOn = true;
+ grabPixmap = gP;
+ setup = s;
+
+ vx = vy = 0.0;
+ readSettings();
+
+ if( !grabPixmap )
+ {
+ grabRootWindow();
+ initialize();
+ do_refresh( QRect ( 0, 0, width(), height() ) );
+ }
+
+ connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) );
+ timer.start( SCI_MAX_SPEED - speed[mode] );
+}
+
+KScienceSaver::~KScienceSaver()
+{
+ timer.stop();
+ releaseLens();
+ if ( d->xRootWin )
+ XDestroyImage( d->xRootWin );
+ XFreeGC(qt_xdisplay(), d->gc );
+ delete d;
+}
+
+void KScienceSaver::myAssert( bool term, const char *eMsg )
+{
+ if( !term ) {
+ fprintf(stderr, "Error in KScreensaver - mode Science: %s\n", eMsg);
+ releaseLens();
+ exit(-1);
+ }
+}
+
+void KScienceSaver::initialize()
+{
+ KRandomSequence rnd;
+ initLens();
+ signed int ws = (signed int) (width() - diam);
+ signed int hs = (signed int) (height() - diam);
+
+ x = (ws > 0) ? (rnd.getDouble() * ws ) : 0.0;
+ y = (hs > 0) ? (rnd.getDouble() * hs ) : 0.0;
+
+ xcoord = (int) x;
+ ycoord = (int) y;
+
+ switch( bpp ) {
+ case 1 : applyLens = &KScienceSaver::applyLens8bpp; break;
+ case 2 : applyLens = &KScienceSaver::applyLens16bpp; break;
+ case 3 : applyLens = &KScienceSaver::applyLens24bpp; break;
+ case 4 : applyLens = &KScienceSaver::applyLens32bpp; break;
+ default: myAssert( false, "unsupported colordepth "\
+ "(only 8, 16, 24, 32 bpp supported)" );
+ }
+}
+
+void KScienceSaver::initWhirlLens()
+{
+ double dx, dy, r, phi, intens;
+ T32bit *off;
+ T32bit xo, yo;
+
+ intens = double( intensity[mode] + 1) / 5.0;
+ if( inverse[mode] )
+ intens = -intens;
+
+ for(int y = side-1; y >= 0; y--)
+ {
+ dy = y - origin;
+ off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side);
+ myAssert( off != 0, "too few memory" );
+ for(int x = side-1; x >= 0; x--)
+ {
+ dx = x - origin;
+ r = sqrt( dx*dx + dy*dy );
+
+ if( r < radius )
+ {
+ if ( dx == 0.0 )
+ phi = (dy > 0.0) ? M_PI_2 :-(M_PI_2);
+ else
+ phi = atan2( dy, dx );
+ phi += intens * ( radius - r ) / ( r+7.0 );
+ xo = (T32bit) ( origin + r*cos( phi ) - x );
+ yo = (T32bit) ( origin + r*sin( phi ) - y );
+ off[x] = xo*bpp + yo*imgnext;
+ }
+ else
+ if( hideBG[mode] )
+ off[x] = (border-y)*imgnext + (border-x)*bpp;
+ else
+ off[x] = 0;
+ }
+ }
+}
+
+void KScienceSaver::initSphereLens()
+{
+ double dx, dy, r, xr, yr, phi, intens;
+ T32bit *off;
+ T32bit xo, yo;
+
+ intens = 1.0 - double( intensity[mode] ) / 20.0;
+
+ if( inverse[mode] )
+ intens = -intens;
+
+ for(int y = side-1; y >= 0; y--)
+ {
+ dy = y - origin;
+ off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side);
+ myAssert( off != 0, "too few memory" );
+ for(int x = side-1; x >= 0; x--)
+ {
+ dx = x - origin;
+ r = sqrt( dx*dx + dy*dy );
+
+ if( r < radius )
+ {
+ xr = (double) radius*cos(asin(dy/radius));
+ yr = (double) radius*cos(asin(dx/radius));
+ phi = (xr != 0.0) ? asin(dx/xr) : 0.0;
+ xo = (T32bit) (origin + intens*2.0*phi*xr / M_PI - x);
+ phi = (yr != 0.0) ? asin(dy/yr) : 0.0;
+ yo = (T32bit) (origin + intens*2.0*phi*yr / M_PI - y);
+ off[x] = xo*bpp + yo*imgnext;
+ }
+ else
+ if( hideBG[mode] )
+ off[x] = (border-y)*imgnext + (border-x)*bpp;
+ else
+ off[x] = 0;
+ }
+ }
+}
+
+void KScienceSaver::initExponentialLens()
+{
+ double dx, dy, r, rnew, f, intens;
+ T32bit *off;
+ T32bit xo, yo;
+
+ if( mode == MODE_EXPONENTIAL )
+ intens = - (0.1 + 0.8 * double( intensity[mode] + 2) / 10.0);
+ else
+ intens = 0.9 - 0.8 * double( intensity[mode] ) / 10.0;
+
+ for(int y = side-1; y >= 0; y--)
+ {
+ dy = y - origin;
+ off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side);
+ myAssert( off != 0, "too few memory" );
+ for(int x = side-1; x >= 0; x--)
+ {
+ dx = x - origin;
+ r = sqrt( dx*dx + dy*dy );
+
+ if( r < radius )
+ {
+ if( r == 0.0 )
+ f = 0.0;
+ else
+ {
+ rnew = radius*(pow(r, intens) / pow(radius, intens));
+ f = double ((int)rnew % radius) / r;
+ }
+ xo = (T32bit) ( origin + f*dx - x );
+ yo = (T32bit) ( origin + f*dy - y );
+ off[x] = xo*bpp + yo*imgnext;
+ }
+ else
+ if( hideBG[mode] )
+ off[x] = (border-y)*imgnext + (border-x)*bpp;
+ else
+ off[x] = 0;
+ }
+ }
+}
+
+void KScienceSaver::initCurvatureLens()
+{
+ double dx, dy, r, f, intens;
+ T32bit *off;
+ T32bit xo, yo;
+
+ intens = (double) radius*intensity[mode] / 20.0;
+ if( inverse[mode] ) intens = -intens;
+
+ for(int y = side-1; y >= 0; y--)
+ {
+ dy = y - origin;
+ off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side);
+ myAssert( off != 0, "too few memory" );
+ for(int x = side-1; x >= 0; x--)
+ {
+ dx = x - origin;
+ r = sqrt( dx*dx + dy*dy );
+
+ if( r < radius )
+ {
+ if( r == 0.0 )
+ f = 0.0;
+ else
+ f = (r - intens * sin(M_PI * r/(double)radius)) / r;
+ xo = (T32bit) ( origin + f*dx - x );
+ yo = (T32bit) ( origin + f*dy - y );
+ off[x] = xo*bpp + yo*imgnext;
+ }
+ else
+ if( hideBG[mode] )
+ off[x] = (border-y)*imgnext + (border-x)*bpp;
+ else
+ off[x] = 0;
+ }
+ }
+}
+
+void KScienceSaver::initWaveLens()
+{
+ double dx, dy, r, rnew, f, intens, k;
+ T32bit *off;
+ T32bit xo, yo;
+
+ intens = (double) intensity[mode] + 1.0;
+ k = (intensity[mode] % 2) ? -12.0 : 12.0;
+
+ for(int y = side-1; y >= 0; y--)
+ {
+ dy = y - origin;
+ off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side);
+ myAssert( off != 0, "too few memory" );
+ for(int x = side-1; x >= 0; x--)
+ {
+ dx = x - origin;
+ r = sqrt( dx*dx + dy*dy );
+
+ if( r < radius )
+ {
+ if( r == 0.0 )
+ f = 0.0;
+ else
+ {
+ rnew = r - k * sin( M_PI * intens * r/(double)radius);
+ f = double ((int)rnew % radius) / r;
+ }
+ xo = (T32bit) ( origin + f*dx - x );
+ yo = (T32bit) ( origin + f*dy - y );
+ off[x] = xo*bpp + yo*imgnext;
+ }
+ else
+ if( hideBG[mode] )
+ off[x] = (border-y)*imgnext + (border-x)*bpp;
+ else
+ off[x] = 0;
+ }
+ }
+}
+
+void KScienceSaver::initLens()
+{
+ int min = (width() < height()) ? width() : height();
+ border = 1 + SCI_MAX_MOVE;
+
+ radius = (size[mode] * min) / 100;
+ if( radius<<1 == min ) radius--;
+ diam = radius << 1;
+ myAssert( diam < min, "assertion violated: diam < min" );
+ origin = radius + border;
+ side = origin << 1;
+
+ d->buffer = XSubImage( d->xRootWin, 0, 0, side, side );
+ myAssert( d->buffer != 0, "can't allocate pixmap" );
+
+ d->offset = (T32bit **) malloc( sizeof(T32bit *) * side );
+ myAssert( d->offset != 0, "too few memory" );
+
+ switch( mode ) {
+ case MODE_WHIRL: initWhirlLens(); break;
+ case MODE_SPHERE: initSphereLens(); break;
+ case MODE_EXPONENTIAL:
+ case MODE_CONTRACTION: initExponentialLens(); break;
+ case MODE_CURVATURE: initCurvatureLens(); break;
+ case MODE_WAVE: initWaveLens(); break;
+ default: myAssert( false, "internal error (wrong mode in initLens() )" );
+ }
+}
+
+void KScienceSaver::releaseLens()
+{
+ if( d->offset != 0 ) {
+ for(int i=0; i<side; i++)
+ if( d->offset[i] != 0 ) free( d->offset[i] );
+ free( d->offset );
+ d->offset = 0;
+ }
+ if( d->buffer != 0 ) {
+ XDestroyImage( d->buffer );
+ d->buffer = 0;
+ }
+}
+
+void KScienceSaver::setMode( int m )
+{
+ timer.stop();
+
+ releaseLens();
+ int old = mode;
+ mode = m;
+ vx = copysign( moveX[mode], vx );
+ vy = copysign( moveY[mode], vy );
+ int dm = diam;
+ initLens();
+ if( hideBG[old] ^ hideBG[m] )
+ do_refresh( QRect( 0, 0, width(), height() ) );
+ else
+ if( diam < dm )
+ {
+ do_refresh( QRect( (int) x+diam, (int) y, dm-diam, diam ) );
+ do_refresh( QRect( (int) x, (int) y+diam, dm, dm-diam ) );
+ }
+
+ timer.start( SCI_MAX_SPEED - speed[mode] );
+}
+
+void KScienceSaver::setMoveX( int s )
+{
+ timer.stop();
+
+ moveX[mode] = s;
+ vx = copysign( moveX[mode], vx );
+
+ timer.start( SCI_MAX_SPEED - speed[mode] );
+}
+
+void KScienceSaver::setMoveY( int s )
+{
+ timer.stop();
+
+ moveY[mode] = s;
+ vy = copysign( moveY[mode], vy );
+
+ timer.start( SCI_MAX_SPEED - speed[mode] );
+}
+
+void KScienceSaver::setMove( bool s )
+{
+ moveOn = s;
+}
+
+void KScienceSaver::setSize( int s )
+{
+ timer.stop();
+
+ releaseLens();
+ int dm = diam;
+ size[mode] = s;
+ initLens();
+ if( diam < dm )
+ {
+ do_refresh( QRect( (int) x+diam, (int) y, dm-diam, diam ) );
+ do_refresh( QRect( (int) x, (int) y+diam, dm, dm-diam ) );
+ }
+
+ timer.start( SCI_MAX_SPEED - speed[mode] );
+}
+
+void KScienceSaver::setSpeed( int s )
+{
+ speed[mode] = s;
+
+ timer.changeInterval( SCI_MAX_SPEED - speed[mode] );
+}
+
+void KScienceSaver::setIntensity( int i )
+{
+ timer.stop();
+
+ releaseLens();
+ intensity[mode] = i;
+ initLens();
+
+ timer.start( SCI_MAX_SPEED - speed[mode]);
+}
+
+void KScienceSaver::setInverse( bool b )
+{
+ timer.stop();
+
+ releaseLens();
+ inverse[mode] = b;
+ initLens();
+
+ timer.start( SCI_MAX_SPEED - speed[mode]);
+}
+
+void KScienceSaver::setGravity( bool b )
+{
+ timer.stop();
+
+ releaseLens();
+ gravity[mode] = b;
+ vy = copysign( moveY[mode], vy );
+ initLens();
+
+ timer.start( SCI_MAX_SPEED - speed[mode]);
+}
+
+void KScienceSaver::setHideBG( bool b )
+{
+ timer.stop();
+
+ releaseLens();
+ hideBG[mode] = b;
+ initLens();
+ do_refresh( QRect( 0, 0, width(), height() ) );
+
+ timer.start( SCI_MAX_SPEED - speed[mode]);
+}
+
+void KScienceSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ QString sMode;
+
+ config->setGroup( "Settings" );
+ mode = config->readNumEntry( "ModeNr", SCI_DEFAULT_MODE );
+
+ for(int i=0; i < MAX_MODES; i++)
+ {
+ sMode.setNum( i );
+ config->setGroup( "Mode" + sMode );
+ moveX[i] = config->readNumEntry( "MoveX", SCI_DEFAULT_MOVEX);
+ moveY[i] = config->readNumEntry( "MoveY", SCI_DEFAULT_MOVEY);
+ size[i] = config->readNumEntry( "Size", SCI_DEFAULT_SIZE);
+ speed[i] = config->readNumEntry( "Speed", SCI_DEFAULT_SPEED);
+ intensity[i] = config->readNumEntry( "Intensity", SCI_DEFAULT_INTENSITY);
+ inverse[i] = config->readBoolEntry( "Inverse", SCI_DEFAULT_INVERSE);
+ gravity[i] = config->readBoolEntry( "Gravity", SCI_DEFAULT_GRAVITY);
+ hideBG[i] = config->readBoolEntry( "HideBG", SCI_DEFAULT_HIDE);
+ }
+
+ vx = copysign( moveX[mode], vx );
+ vy = copysign( moveY[mode], vy );
+}
+
+void KScienceSaver::do_refresh( const QRect & rect )
+{
+ if( grabPixmap )
+ return;
+ rect.normalize();
+
+ if( hideBG[mode] )
+ {
+ XSetWindowBackground( qt_xdisplay(), winId(), black.pixel() );
+ XClearArea( qt_xdisplay(), winId(), rect.left(), rect.top(),
+ rect.width(), rect.height(), false );
+ }
+ else
+ {
+ myAssert( d->xRootWin != 0, "root window not grabbed" );
+ XPutImage( qt_xdisplay(), winId(), d->gc, d->xRootWin,
+ rect.left(), rect.top(),
+ rect.left(), rect.top(),
+ rect.width(), rect.height() );
+ }
+}
+
+void KScienceSaver::slotTimeout()
+{
+ if( grabPixmap ) {
+ if( !QWidget::find(winId())->isActiveWindow() )
+ return;
+ grabPreviewWidget();
+ grabPixmap = false;
+ initialize();
+ if( hideBG[mode] )
+ do_refresh( QRect ( 0, 0, width(), height() ) );
+ }
+
+ signed int oldx = xcoord, oldy = ycoord;
+
+ if( gravity[mode] ) {
+ double h = double(y+1.0) / double(height()-diam);
+ if( h > 1.0 ) h = 1.0;
+ vy = sqrt( h ) * ( (vy > 0.0) ? moveY[mode] : -moveY[mode] );
+ }
+ myAssert( abs((int)rint(vy)) <= border, "assertion violated: vy <= border" );
+
+ if( moveOn )
+ {
+ x += vx;
+ y += vy;
+ }
+
+ if( x <= 0.0 ) {
+ vx = -vx;
+ x = 0.0;
+ }
+ if( int(x) + diam >= width()) {
+ vx = -vx;
+ myAssert( width()-diam > 0, "assertion violated: width-diam > 0" );
+ x = (double) (width() - diam - 1);
+ }
+ if( y <= 0.0 ) {
+ vy = -vy;
+ y = 0.0;
+ }
+ if( int(y) + diam >= height() ) {
+ vy = -vy;
+ myAssert( height() - diam > 0, "assertion violated: height-diam > 0" );
+ y = (double) (height() - diam - 1);
+ }
+
+ xcoord = (int) x ;
+ ycoord = (int) y ;
+ signed int dx = (signed int) xcoord - oldx;
+ signed int dy = (signed int) ycoord - oldy;
+ signed int xs, ys, xd, yd, w, h;
+
+ if( dx > 0 ) {
+ w = diam+dx;
+ xd = oldx;
+ xs = border-dx;
+ if( dy > 0 ) {
+ h = diam+dy;
+ yd = oldy;
+ ys = border-dy;
+ }
+ else {
+ h = diam-dy;
+ yd = ycoord;
+ ys = border;
+ }
+ }
+ else {
+ w = diam-dx;
+ xd = xcoord;
+ xs = border;
+ if( dy > 0 ) {
+ h = diam+dy;
+ yd = oldy;
+ ys = border-dy;
+ } else {
+ h = diam-dy;
+ yd = ycoord;
+ ys = border;
+ }
+ }
+
+ if( xd + w >= width() ) w = width() - xd - 1;
+ if( yd + h >= height() ) h = height() - yd - 1;
+
+//printf("%d: (dx: %3d, dy: %3d), diam: %3d, (xc: %3d, yc: %3d), (xs: %3d, ys: %3d), (xd: %3d, yd: %3d), (w: %3d, h: %3d)\n", mode, dx, dy, diam, xcoord, ycoord, xs, ys, xd, yd, w, h);
+ myAssert( dx <= border && dy <=border, "assertion violated: dx or dy <= border");
+ myAssert( xcoord >= 0 && ycoord >= 0, "assertion violated: xcoord, ycoord >= 0 ");
+ myAssert( xd+w < width(), "assertion violated: xd+w < width" );
+ myAssert( yd+h < height(), "assertion violated: yd+h < height" );
+
+ if( hideBG[mode] )
+ blackPixel( xcoord, ycoord );
+ (this->*applyLens)(xs, ys, xd, yd, w, h);
+ XPutImage( qt_xdisplay(), winId(), d->gc, d->buffer, 0, 0, xd, yd, w, h );
+ if( hideBG[mode] )
+ blackPixelUndo( xcoord, ycoord );
+}
+
+void KScienceSaver::grabRootWindow()
+{
+ Display *dsp = qt_xdisplay();
+ Window rootwin = RootWindow( dsp, qt_xscreen() );
+
+ // grab contents of root window
+ if( d->xRootWin )
+ XDestroyImage( d->xRootWin );
+
+ d->xRootWin = XGetImage( dsp, rootwin, 0, 0, width(),
+ height(), AllPlanes, ZPixmap);
+ myAssert( d->xRootWin, "unable to grab root window\n" );
+
+ imgnext = d->xRootWin->bytes_per_line;
+ bpp = ( d->xRootWin->bits_per_pixel ) >> 3;
+}
+
+void KScienceSaver::grabPreviewWidget()
+{
+ myAssert( QWidget::find(winId())->isActiveWindow(), "can't grab preview widget: dialog not active()" );
+
+ if( d->xRootWin )
+ XDestroyImage( d->xRootWin );
+
+ Display *dsp = qt_xdisplay();
+ d->xRootWin = XGetImage( dsp, winId(), 0, 0, width(), height(), AllPlanes, ZPixmap);
+ myAssert( d->xRootWin, "unable to grab preview window\n" );
+
+ imgnext = d->xRootWin->bytes_per_line;
+ bpp = ( d->xRootWin->bits_per_pixel ) >> 3;
+}
+
+void KScienceSaver::blackPixel( int x, int y )
+{
+ unsigned char black = (char) BlackPixel( qt_xdisplay(), qt_xscreen() );
+ unsigned int adr = x*bpp + y*imgnext;
+
+ for(int i=0; i<bpp; i++) {
+ blackRestore[i] = d->xRootWin->data[adr];
+ d->xRootWin->data[adr++] = black;
+ }
+}
+
+void KScienceSaver::blackPixelUndo( int x, int y )
+{
+ unsigned int adr = x*bpp + y*imgnext;
+ for(int i=0; i<bpp; i++)
+ d->xRootWin->data[adr++] = blackRestore[i];
+}
+
+// hm....
+
+void KScienceSaver::applyLens8bpp(int xs, int ys, int xd, int yd, int w, int h)
+{
+ T32bit *off;
+ char *img1, *img2, *data;
+ signed int ix, iy, datanext = d->buffer->bytes_per_line - w;
+
+ img1 = d->xRootWin->data + xd + yd*imgnext;
+ data = d->buffer->data;
+ for(iy = ys; iy < ys+h; iy++)
+ {
+ off = d->offset[iy] + xs;
+ img2 = img1;
+ for(ix = w; ix > 0; ix--)
+ *data++ = img2++[*off++];
+ img1 += imgnext;
+ data += datanext;
+ }
+
+}
+
+void KScienceSaver::applyLens16bpp(int xs, int ys, int xd, int yd, int w, int h)
+{
+ T32bit *off;
+ char *img1, *img2, *data;
+ int ix, iy, datanext = d->buffer->bytes_per_line - (w << 1);
+
+ img1 = d->xRootWin->data + (xd << 1) + yd*imgnext;
+ data = d->buffer->data;
+ for(iy = ys; iy < ys+h; iy++)
+ {
+ off = d->offset[iy] + xs;
+ img2 = img1;
+ for(ix = w; ix > 0; ix--) {
+ *data++ = img2++[*off];
+ *data++ = img2++[*off++];
+ }
+ img1 += imgnext;
+ data += datanext;
+ }
+}
+
+void KScienceSaver::applyLens24bpp(int xs, int ys, int xd, int yd, int w, int h)
+{
+ T32bit *off;
+ char *img1, *img2, *data;
+ signed int ix, iy, datanext = d->buffer->bytes_per_line - 3*w;
+
+ img1 = d->xRootWin->data + 3*xd + yd*imgnext;
+ data = d->buffer->data;
+ for(iy = ys; iy < ys+h; iy++)
+ {
+ off = d->offset[iy] + xs;
+ img2 = img1;
+ for(ix = w; ix > 0; ix--) {
+ *data++ = img2++[*off];
+ *data++ = img2++[*off];
+ *data++ = img2++[*off++];
+ }
+ img1 += imgnext;
+ data += datanext;
+ }
+}
+
+void KScienceSaver::applyLens32bpp(int xs, int ys, int xd, int yd, int w, int h)
+{
+ T32bit *off;
+ char *img1, *img2, *data;
+ signed int ix, iy, datanext = d->buffer->bytes_per_line - (w << 2);
+
+ img1 = d->xRootWin->data + (xd << 2) + yd*imgnext;
+ data = d->buffer->data;
+ for(iy = ys; iy < ys+h; iy++)
+ {
+ off = d->offset[iy] + xs;
+ img2 = img1;
+ for(ix = w; ix > 0; ix--) {
+ *data++ = img2++[*off];
+ *data++ = img2++[*off];
+ *data++ = img2++[*off];
+ *data++ = img2++[*off++];
+ }
+ img1 += imgnext;
+ data += datanext;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+
+KScienceSetup::KScienceSetup( QWidget *parent, const char *name )
+ : KDialogBase( parent, name, true, i18n( "Setup Science Screen Saver" ),
+ Ok|Cancel|Help, Ok, true ), saver( 0 )
+{
+ readSettings();
+ initModeInfo();
+
+ QWidget *main = makeMainWidget();
+
+ QHBoxLayout *lt = new QHBoxLayout( main, 0, spacingHint());
+ QVBoxLayout *ltm = new QVBoxLayout;
+ lt->addLayout( ltm );
+ QVBoxLayout *ltc = new QVBoxLayout;
+ lt->addLayout( ltc );
+
+ // mode
+ QLabel *label = new QLabel( i18n("Mode:"), main );
+ ltm->addWidget( label );
+
+ QListBox *c = new QListBox( main );
+ for(int i = 0; i<MAX_MODES; i++)
+ c->insertItem( modeInfo[i].name );
+ c->setCurrentItem( mode );
+ c->setFixedHeight( 5 * c->fontMetrics().height() );
+ connect( c, SIGNAL( highlighted( int ) ), SLOT( slotMode( int ) ) );
+ ltm->addWidget( c );
+
+ // inverse
+ QCheckBox *cbox = checkInverse = new QCheckBox( i18n("Inverse"), main );
+ cbox->setEnabled( modeInfo[mode].inverseEnable );
+ cbox->setChecked( inverse[mode] );
+ connect( cbox, SIGNAL( clicked() ), SLOT( slotInverse() ) );
+ ltm->addWidget( cbox );
+
+ // gravity
+ cbox = checkGravity = new QCheckBox( i18n("Gravity"), main );
+ cbox->setChecked( gravity[mode] );
+ connect( cbox, SIGNAL( clicked() ), SLOT( slotGravity() ) );
+ ltm->addWidget( cbox );
+
+ // hide background
+ cbox = checkHideBG = new QCheckBox( i18n("Hide background"), main );
+ cbox->setChecked( hideBG[mode] );
+ connect( cbox, SIGNAL( clicked() ), SLOT( slotHideBG() ) );
+ ltm->addWidget( cbox );
+ ltm->addStretch();
+
+ // size
+ label = new QLabel( i18n("Size:"), main );
+ ltc->addWidget( label );
+
+ slideSize = new QSlider(9, 50, 5, size[mode], QSlider::Horizontal,
+ main );
+ slideSize->setMinimumSize( 90, 20 );
+ slideSize->setTickmarks(QSlider::Below);
+ slideSize->setTickInterval(5);
+ connect( slideSize, SIGNAL( sliderMoved( int ) ),
+ SLOT( slotSize( int ) ) );
+ connect( slideSize, SIGNAL( sliderPressed() ),
+ SLOT( slotSliderPressed() ) );
+ connect( slideSize, SIGNAL( sliderReleased() ),
+ SLOT( slotSliderReleased() ) );
+
+ ltc->addWidget( slideSize );
+
+ // intensity
+ label = new QLabel( i18n("Intensity:"), main );
+ ltc->addWidget( label );
+
+ slideIntensity = new QSlider(0, 10, 1, intensity[mode],
+ QSlider::Horizontal, main );
+ slideIntensity->setMinimumSize( 90, 20 );
+ slideIntensity->setTickmarks(QSlider::Below);
+ slideIntensity->setTickInterval(1);
+ connect( slideIntensity, SIGNAL( sliderMoved( int ) ),
+ SLOT( slotIntensity( int )) );
+ connect( slideIntensity, SIGNAL( sliderPressed() ),
+ SLOT( slotSliderPressed() ) );
+ connect( slideIntensity, SIGNAL( sliderReleased() ),
+ SLOT( slotSliderReleased() ) );
+ ltc->addWidget( slideIntensity );
+
+ // speed
+ label = new QLabel( i18n("Speed:"), main );
+ ltc->addWidget( label );
+
+ slideSpeed = new QSlider(0, SCI_MAX_SPEED, 10, speed[mode],
+ QSlider::Horizontal, main );
+ slideSpeed->setMinimumSize( 90, 20 );
+ slideSpeed->setTickmarks(QSlider::Below);
+ slideSpeed->setTickInterval(10);
+ connect( slideSpeed, SIGNAL( sliderMoved( int ) ),
+ SLOT( slotSpeed( int ) ) );
+ ltc->addWidget( slideSpeed );
+
+ // motion
+ label = new QLabel( i18n("Motion:"), main );
+ ltc->addWidget( label );
+
+ QHBoxLayout *ltcm = new QHBoxLayout;
+ ltc->addLayout( ltcm );
+
+ slideMoveX = new QSlider(0, SCI_MAX_MOVE, 5, moveX[mode],
+ QSlider::Horizontal, main );
+ slideMoveX->setMinimumSize( 40, 20 );
+ slideMoveX->setTickmarks(QSlider::Below);
+ slideMoveX->setTickInterval(5);
+ connect( slideMoveX, SIGNAL( sliderMoved( int ) ),
+ SLOT( slotMoveX( int ) ) );
+ ltcm->addWidget( slideMoveX );
+
+ slideMoveY = new QSlider(0, SCI_MAX_MOVE, 5, moveY[mode],
+ QSlider::Horizontal, main );
+ slideMoveY->setMinimumSize( 40, 20 );
+ slideMoveY->setTickmarks(QSlider::Below);
+ slideMoveY->setTickInterval(5);
+ connect( slideMoveY, SIGNAL( sliderMoved( int ) ),
+ SLOT( slotMoveY( int ) ) );
+ ltcm->addWidget( slideMoveY );
+
+ ltc->addStretch();
+
+ // preview
+ preview = new KPreviewWidget( main );
+ preview->setFixedSize( 220, 170 );
+ QPixmap p( locate("data", "kscreensaver/pics/kscience.png") );
+ if( p.isNull() )
+ preview->setBackgroundColor( black );
+ else
+ preview->setBackgroundPixmap( p );
+ preview->show(); // otherwise saver does not get correct size
+ lt->addWidget( preview );
+
+ // let the preview window display before creating the saver
+ kapp->processEvents();
+
+ saver = new KScienceSaver( preview->winId(), true, !p.isNull() );
+ preview->notifySaver( saver );
+}
+
+KScienceSetup::~KScienceSetup()
+{
+ delete saver; // be sure to delete this first
+}
+
+void KScienceSetup::updateSettings()
+{
+ // update dialog
+ slideMoveX ->setValue( moveX[mode] );
+ slideMoveY ->setValue( moveY[mode] );
+ slideSize ->setValue( size[mode] );
+ slideSpeed ->setValue( speed[mode] );
+ slideIntensity->setValue( intensity[mode] );
+ checkInverse ->setEnabled( modeInfo[mode].inverseEnable );
+ checkInverse ->setChecked( inverse[mode] );
+ checkGravity ->setChecked( gravity[mode] );
+ checkHideBG ->setChecked( hideBG[mode] );
+}
+
+// read settings from config file
+void KScienceSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ QString sMode;
+
+ config->setGroup( "Settings" );
+ mode = config->readNumEntry( "ModeNr", SCI_DEFAULT_MODE );
+
+ for(int i=0; i < MAX_MODES; i++)
+ {
+ sMode.setNum( i );
+ config->setGroup( "Mode" + sMode );
+ moveX[i] = config->readNumEntry( "MoveX", SCI_DEFAULT_MOVEX);
+ moveY[i] = config->readNumEntry( "MoveY", SCI_DEFAULT_MOVEY);
+ size[i] = config->readNumEntry( "Size", SCI_DEFAULT_SIZE);
+ speed[i] = config->readNumEntry( "Speed", SCI_DEFAULT_SPEED);
+ intensity[i] = config->readNumEntry( "Intensity", SCI_DEFAULT_INTENSITY);
+ inverse[i] = config->readBoolEntry( "Inverse", SCI_DEFAULT_INVERSE);
+ gravity[i] = config->readBoolEntry( "Gravity", SCI_DEFAULT_GRAVITY);
+ hideBG[i] = config->readBoolEntry( "HideBG", SCI_DEFAULT_HIDE);
+ }
+}
+
+void KScienceSetup::slotMode( int m )
+{
+ mode = m;
+
+ if( saver )
+ saver->setMode( mode );
+
+ updateSettings();
+}
+
+void KScienceSetup::slotInverse( )
+{
+ inverse[mode] = checkInverse->isChecked();
+
+ if( saver )
+ saver->setInverse( inverse[mode] );
+}
+
+void KScienceSetup::slotGravity( )
+{
+ gravity[mode] = checkGravity->isChecked();
+
+ if( saver )
+ saver->setGravity( gravity[mode] );
+}
+
+void KScienceSetup::slotHideBG( )
+{
+ hideBG[mode] = checkHideBG->isChecked();
+
+ if( saver )
+ saver->setHideBG( hideBG[mode] );
+}
+
+void KScienceSetup::slotMoveX( int x )
+{
+ moveX[mode] = x;
+
+ if( saver )
+ saver->setMoveX( x );
+}
+
+void KScienceSetup::slotMoveY( int y )
+{
+ moveY[mode] = y;
+
+ if( saver )
+ saver->setMoveY( y );
+}
+
+void KScienceSetup::slotSize( int s )
+{
+ size[mode] = s;
+
+ if( saver )
+ saver->setSize( s );
+}
+
+void KScienceSetup::slotSpeed( int s )
+{
+ speed[mode] = s;
+
+ if( saver )
+ saver->setSpeed( s );
+}
+
+void KScienceSetup::slotIntensity( int i )
+{
+ intensity[mode] = i;
+
+ if( saver )
+ saver->setIntensity( i );
+}
+
+void KScienceSetup::slotSliderPressed()
+{
+ if( saver )
+ saver->setMove( false );
+}
+
+void KScienceSetup::slotSliderReleased()
+{
+ if( saver )
+ saver->setMove( true );
+}
+
+// Ok pressed - save settings and exit
+void KScienceSetup::slotOk()
+{
+ KConfig *config = KGlobal::config();
+ QString sSize, sSpeed, sIntensity, sMode;
+
+ config->setGroup( "Settings" );
+ config->writeEntry( "ModeNr", mode );
+
+ for(int i=0; i<MAX_MODES; i++)
+ {
+ sMode.setNum( i );
+ config->setGroup( "Mode" + sMode );
+ config->writeEntry( "MoveX", moveX[i] );
+ config->writeEntry( "MoveY", moveY[i] );
+ config->writeEntry( "Size", size[i] );
+ config->writeEntry( "Speed", speed[i] );
+ config->writeEntry( "Intensity", intensity[i] );
+ config->writeEntry( "Inverse", inverse[i] );
+ config->writeEntry( "Gravity", gravity[i] );
+ config->writeEntry( "HideBG", hideBG[i] );
+ }
+
+ config->sync();
+
+ accept();
+}
+
+void KScienceSetup::slotHelp()
+{
+ QString about = i18n("Science Version 0.26.5\n\nWritten by Rene Beutler (1998)\nrbeutler@g26.ethz.ch");
+ KMessageBox::about(this,
+ about);
+}
diff --git a/kscreensaver/kdesavers/science.h b/kscreensaver/kdesavers/science.h
new file mode 100644
index 00000000..7211f5d5
--- /dev/null
+++ b/kscreensaver/kdesavers/science.h
@@ -0,0 +1,148 @@
+// ----------------------------------------------------------------
+//
+// kscience - screen saver for KDE
+//
+// copyright (c) Rene Beutler 1998
+//
+
+#ifndef __SCIENCE_H__
+#define __SCIENCE_H__
+
+#include <qrect.h>
+#include <qtimer.h>
+#include <kdialogbase.h>
+#include <kscreensaver.h>
+
+class QSlider;
+class QCheckBox;
+
+#define MAX_MODES 6
+
+typedef signed int T32bit;
+
+class KScienceSaver;
+
+class KPreviewWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ KPreviewWidget( QWidget *parent );
+ void paintEvent( QPaintEvent *event );
+ void notifySaver( KScienceSaver *s = 0 );
+private:
+ KScienceSaver *saver;
+};
+
+struct KScienceData;
+
+class KScienceSaver : public KScreenSaver
+{
+ Q_OBJECT
+public:
+ KScienceSaver( WId id, bool setup=false, bool gP=false);
+ virtual ~KScienceSaver();
+
+ void do_refresh( const QRect & rect );
+ void setMode ( int mode );
+ void setMoveX ( signed int s );
+ void setMoveY ( signed int s );
+ void setMove ( bool s );
+ void setSize ( signed int s );
+ void setIntensity ( signed int s );
+ void setSpeed ( signed int s );
+ void setInverse ( bool b );
+ void setGravity ( bool b );
+ void setHideBG ( bool b );
+
+ void myAssert( bool term, const char *sMsg );
+
+private:
+ void readSettings();
+ void initLens();
+ void initialize();
+ void releaseLens();
+ void (KScienceSaver::*applyLens)(int xs, int ys, int xd, int yd, int w, int h);
+
+protected slots:
+ void slotTimeout();
+
+protected:
+ void grabRootWindow();
+ void grabPreviewWidget();
+ void initWhirlLens();
+ void initSphereLens();
+ void initExponentialLens();
+ void initWaveLens();
+ void initCurvatureLens();
+ void blackPixel( int x, int y );
+ void blackPixelUndo( int x, int y);
+ void applyLens8bpp( int xs, int ys, int xd, int yd, int w, int h);
+ void applyLens16bpp(int xs, int ys, int xd, int yd, int w, int h);
+ void applyLens24bpp(int xs, int ys, int xd, int yd, int w, int h);
+ void applyLens32bpp(int xs, int ys, int xd, int yd, int w, int h);
+ QTimer timer;
+ bool moveOn;
+ bool setup;
+ bool grabPixmap;
+ int mode;
+ bool inverse[MAX_MODES];
+ bool gravity[MAX_MODES];
+ bool hideBG[MAX_MODES];
+ signed int size[MAX_MODES];
+ signed int moveX[MAX_MODES];
+ signed int moveY[MAX_MODES];
+ signed int speed[MAX_MODES];
+ signed int intensity[MAX_MODES];
+ int xcoord, ycoord;
+ double x, y, vx, vy;
+ signed int bpp, side;
+ int border, radius, diam, origin;
+ int imgnext;
+ char blackRestore[4];
+ KScienceData *d;
+};
+
+
+class KScienceSetup : public KDialogBase
+{
+ Q_OBJECT
+public:
+ KScienceSetup(QWidget *parent=0, const char *name=0);
+ ~KScienceSetup();
+protected:
+ void updateSettings();
+ void readSettings();
+
+private slots:
+ void slotMode( int );
+ void slotInverse();
+ void slotGravity();
+ void slotHideBG();
+ void slotMoveX( int );
+ void slotMoveY( int );
+ void slotSize( int );
+ void slotIntensity( int );
+ void slotSliderPressed();
+ void slotSliderReleased();
+ void slotSpeed( int );
+ void slotOk();
+ void slotHelp();
+
+private:
+ KPreviewWidget *preview;
+ KScienceSaver *saver;
+ QSlider *slideSize, *slideSpeed, *slideIntensity;
+ QSlider *slideMoveX, *slideMoveY;
+ QCheckBox *checkInverse, *checkGravity, *checkHideBG;
+
+ int mode;
+ bool inverse [MAX_MODES];
+ bool gravity [MAX_MODES];
+ bool hideBG [MAX_MODES];
+ int moveX [MAX_MODES];
+ int moveY [MAX_MODES];
+ int size [MAX_MODES];
+ int intensity[MAX_MODES];
+ int speed [MAX_MODES];
+};
+#endif
diff --git a/kscreensaver/kdesavers/slideshow.cpp b/kscreensaver/kdesavers/slideshow.cpp
new file mode 100644
index 00000000..29df23ae
--- /dev/null
+++ b/kscreensaver/kdesavers/slideshow.cpp
@@ -0,0 +1,1022 @@
+/* Slide Show Screen Saver
+ * (C) 1999 Stefan Taferner <taferner@kde.org>
+ * (C) 2001 Martin R. Jones <mjones@kde.org>
+ * (C) 2003 Chris Howells <howells@kde.org>
+ * (C) 2003 Sven Leiber <s.leiber@web.de>
+ *
+ * This code is under GPL
+ *
+ * 2001/03/04 Converted to libkscreensaver by Martin R. Jones.
+ */
+
+
+#include <qdir.h>
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qfile.h>
+#include <qpaintdevicemetrics.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qframe.h>
+#include <qdesktopwidget.h>
+
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kimageio.h>
+#include <kfiledialog.h>
+#include <kstandarddirs.h>
+#include <kurlrequester.h>
+#include <kaboutdata.h>
+#include <kaboutapplication.h>
+#include <kdebug.h>
+
+#include <stdlib.h>
+#include <assert.h>
+#include <math.h>
+#include <time.h>
+
+#include "slideshow.h"
+#include "slideshow.moc"
+#include "slideshowcfg.h"
+
+
+#define SLIDESHOW_VERSION "2.3.0"
+static const char version[] = SLIDESHOW_VERSION;
+static const char description[] = I18N_NOOP("KSlideshow");
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kslideshow.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "KSlideshow" );
+ KDE_EXPORT const char *kss_version = SLIDESHOW_VERSION;
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new kSlideShowSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new kSlideShowSetup();
+ }
+}
+
+
+//=============================================================================
+// Class kSlideShowSaver
+//=============================================================================
+kSlideShowSaver::kSlideShowSaver( WId id ): KScreenSaver(id)
+{
+ KImageIO::registerFormats();
+
+ blank();
+
+ mEffect = NULL;
+ mNumEffects = 0;
+ mIntArray = NULL;
+ registerEffects();
+
+ readConfig();
+ initNextScreen();
+
+ mFileIdx = 0;
+ mColorContext = QColor::enterAllocContext();
+
+ mEffectRunning = false;
+
+ mTimer.start(10, true);
+ connect(&mTimer, SIGNAL(timeout()), SLOT(slotTimeout()));
+
+ QDesktopWidget *d = QApplication::desktop();
+ if( geometry() == d->geometry() && d->numScreens() > 1)
+ {
+ for(int i = 0; i < d->numScreens(); ++i)
+ {
+ QRect s = d->screenGeometry(i);
+ mGeoList.append(new mScreenGeo(s.width(), s.height(), s.topLeft().x(), s.topLeft().y()));
+ }
+ }
+ else
+ {
+ mGeoList.append(new mScreenGeo(width(), height(), 0, 0 ));
+ }
+ createNextScreen();
+}
+
+
+//----------------------------------------------------------------------------
+kSlideShowSaver::~kSlideShowSaver()
+{
+ delete [] mIntArray;
+ delete [] mEffectList;
+
+ mTimer.stop();
+ if (mPainter.isActive()) mPainter.end();
+ QColor::leaveAllocContext();
+ QColor::destroyAllocContext(mColorContext);
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSaver::initNextScreen()
+{
+ QPaintDeviceMetrics metric(this);
+ int w, h;
+
+ w = width();
+ h = height();
+ mNextScreen = QPixmap(w, h, metric.depth());
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSaver::readConfig()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+ mShowRandom = config->readBoolEntry("ShowRandom", true);
+ mZoomImages = config->readBoolEntry("ZoomImages", false);
+ mPrintName = config->readBoolEntry("PrintName", true);
+ mDirectory = config->readPathEntry("Directory", KGlobal::dirs()->findDirs("wallpaper", "").last());
+ mDelay = config->readNumEntry("Delay", 10) * 1000;
+ mSubdirectory = config->readBoolEntry("SubDirectory", false);
+ mRandomPosition = config->readBoolEntry("RandomPosition", false);
+
+ loadDirectory();
+}
+
+
+//----------------------------------------------------------------------------
+void kSlideShowSaver::registerEffects()
+{
+ int i = 0;
+
+ mEffectList = new EffectMethod[64];
+ mEffectList[i++] = &kSlideShowSaver::effectChessboard;
+ mEffectList[i++] = &kSlideShowSaver::effectMultiCircleOut;
+ mEffectList[i++] = &kSlideShowSaver::effectSpiralIn;
+ mEffectList[i++] = &kSlideShowSaver::effectSweep;
+ mEffectList[i++] = &kSlideShowSaver::effectMeltdown;
+ mEffectList[i++] = &kSlideShowSaver::effectCircleOut;
+ mEffectList[i++] = &kSlideShowSaver::effectBlobs;
+ mEffectList[i++] = &kSlideShowSaver::effectHorizLines;
+ mEffectList[i++] = &kSlideShowSaver::effectVertLines;
+ mEffectList[i++] = &kSlideShowSaver::effectRandom;
+ mEffectList[i++] = &kSlideShowSaver::effectGrowing;
+ mEffectList[i++] = &kSlideShowSaver::effectIncomingEdges;
+
+ mNumEffects = i;
+ // mNumEffects = 1; //...for testing
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectMultiCircleOut(bool aInit)
+{
+ int x, y, i;
+ double alpha;
+ static QPointArray pa(4);
+
+ if (aInit)
+ {
+ startPainter();
+ mw = width();
+ mh = height();
+ mx = mw;
+ my = mh>>1;
+ pa.setPoint(0, mw>>1, mh>>1);
+ pa.setPoint(3, mw>>1, mh>>1);
+ mfy = sqrt((double)mw*mw + mh*mh) / 2;
+ mi = KApplication::random()%15 + 2;
+ mfd = M_PI*2/mi;
+ mAlpha = mfd;
+ mwait = 10 * mi;
+ mfx = M_PI/32; // divisor must be powers of 8
+ }
+
+ if (mAlpha < 0)
+ {
+ mPainter.end();
+ showNextScreen();
+ return -1;
+ }
+
+ for (alpha=mAlpha, i=mi; i>=0; i--, alpha+=mfd)
+ {
+ x = (mw>>1) + (int)(mfy * cos(-alpha));
+ y = (mh>>1) + (int)(mfy * sin(-alpha));
+
+ mx = (mw>>1) + (int)(mfy * cos(-alpha + mfx));
+ my = (mh>>1) + (int)(mfy * sin(-alpha + mfx));
+
+ pa.setPoint(1, x, y);
+ pa.setPoint(2, mx, my);
+
+ mPainter.drawPolygon(pa);
+ }
+ mAlpha -= mfx;
+
+ return mwait;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectSpiralIn(bool aInit)
+{
+ if (aInit)
+ {
+ startPainter();
+ mw = width();
+ mh = height();
+ mix = mw / 8;
+ miy = mh / 8;
+ mx0 = 0;
+ mx1 = mw - mix;
+ my0 = miy;
+ my1 = mh - miy;
+ mdx = mix;
+ mdy = 0;
+ mi = 0;
+ mj = 16 * 16;
+ mx = 0;
+ my = 0;
+ }
+
+ if (mi==0 && mx0>=mx1)
+ {
+ mPainter.end();
+ showNextScreen();
+ return -1;
+ }
+
+ if (mi==0 && mx>=mx1) // switch to: down on right side
+ {
+ mi = 1;
+ mdx = 0;
+ mdy = miy;
+ mx1 -= mix;
+ }
+ else if (mi==1 && my>=my1) // switch to: right to left on bottom side
+ {
+ mi = 2;
+ mdx = -mix;
+ mdy = 0;
+ my1 -= miy;
+ }
+ else if (mi==2 && mx<=mx0) // switch to: up on left side
+ {
+ mi = 3;
+ mdx = 0;
+ mdy = -miy;
+ mx0 += mix;
+ }
+ else if (mi==3 && my<=my0) // switch to: left to right on top side
+ {
+ mi = 0;
+ mdx = mix;
+ mdy = 0;
+ my0 += miy;
+ }
+
+ bitBlt(this, mx, my, &mNextScreen, mx, my, mix, miy, CopyROP, true);
+
+ mx += mdx;
+ my += mdy;
+ mj--;
+
+ return 8;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectMeltdown(bool aInit)
+{
+ int i, x, y;
+ bool done;
+
+ if (aInit)
+ {
+ delete [] mIntArray;
+ mw = width();
+ mh = height();
+ mdx = 4;
+ mdy = 16;
+ mix = mw / mdx;
+ mIntArray = new int[mix];
+ for (i=mix-1; i>=0; i--)
+ mIntArray[i] = 0;
+ }
+
+ done = true;
+ for (i=0,x=0; i<mix; i++,x+=mdx)
+ {
+ y = mIntArray[i];
+ if (y >= mh) continue;
+ done = false;
+ if ((KApplication::random()&15) < 6) continue;
+ bitBlt(this, x, y+mdy, this, x, y, mdx, mh-y-mdy, CopyROP, true);
+ bitBlt(this, x, y, &mNextScreen, x, y, mdx, mdy, CopyROP, true);
+ mIntArray[i] += mdy;
+ }
+
+ if (done)
+ {
+ delete [] mIntArray;
+ mIntArray = NULL;
+ return -1;
+ }
+
+ return 15;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectCircleOut(bool aInit)
+{
+ int x, y;
+ static QPointArray pa(4);
+
+ if (aInit)
+ {
+ startPainter();
+ mw = width();
+ mh = height();
+ mx = mw;
+ my = mh>>1;
+ mAlpha = 2*M_PI;
+ pa.setPoint(0, mw>>1, mh>>1);
+ pa.setPoint(3, mw>>1, mh>>1);
+ mfx = M_PI/16; // divisor must be powers of 8
+ mfy = sqrt((double)mw*mw + mh*mh) / 2;
+ }
+
+ if (mAlpha < 0)
+ {
+ mPainter.end();
+ showNextScreen();
+ return -1;
+ }
+
+ x = mx;
+ y = my;
+ mx = (mw>>1) + (int)(mfy * cos(mAlpha));
+ my = (mh>>1) + (int)(mfy * sin(mAlpha));
+ mAlpha -= mfx;
+
+ pa.setPoint(1, x, y);
+ pa.setPoint(2, mx, my);
+
+ mPainter.drawPolygon(pa);
+
+ return 20;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectSweep(bool aInit)
+{
+ int w, h, x, y, i;
+
+ if (aInit)
+ {
+ // subtype: 0=sweep right to left, 1=sweep left to right
+ // 2=sweep bottom to top, 3=sweep top to bottom
+ mSubType = KApplication::random() % 4;
+ mw = width();
+ mh = height();
+ mdx = (mSubType==1 ? 16 : -16);
+ mdy = (mSubType==3 ? 16 : -16);
+ mx = (mSubType==1 ? 0 : mw);
+ my = (mSubType==3 ? 0 : mh);
+ }
+
+ if (mSubType==0 || mSubType==1)
+ {
+ // horizontal sweep
+ if ((mSubType==0 && mx < -64) ||
+ (mSubType==1 && mx > mw+64))
+ {
+ return -1;
+ }
+ for (w=2,i=4,x=mx; i>0; i--, w<<=1, x-=mdx)
+ {
+ bitBlt(this, x, 0, &mNextScreen, x, 0, w, mh, CopyROP, true);
+ }
+ mx += mdx;
+ }
+ else
+ {
+ // vertical sweep
+ if ((mSubType==2 && my < -64) ||
+ (mSubType==3 && my > mh+64))
+ {
+ return -1;
+ }
+ for (h=2,i=4,y=my; i>0; i--, h<<=1, y-=mdy)
+ {
+ bitBlt(this, 0, y, &mNextScreen, 0, y, mw, h, CopyROP, true);
+ }
+ my += mdy;
+ }
+
+ return 20;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectBlobs(bool aInit)
+{
+ int r;
+
+ if (aInit)
+ {
+ startPainter();
+ mAlpha = M_PI * 2;
+ mw = width();
+ mh = height();
+ mi = 150;
+ }
+
+ if (mi <= 0)
+ {
+ mPainter.end();
+ showNextScreen();
+ return -1;
+ }
+
+ mx = KApplication::random() % mw;
+ my = KApplication::random() % mh;
+ r = (KApplication::random() % 200) + 50;
+
+ mPainter.drawEllipse(mx-r, my-r, r, r);
+ mi--;
+
+ return 10;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectRandom(bool /*aInit*/)
+{
+ int x, y, i, w, h, fact, sz;
+
+ fact = (KApplication::random() % 3) + 1;
+
+ w = width() >> fact;
+ h = height() >> fact;
+ sz = 1 << fact;
+
+ for (i = (w*h)<<1; i > 0; i--)
+ {
+ x = (KApplication::random() % w) << fact;
+ y = (KApplication::random() % h) << fact;
+ bitBlt(this, x, y, &mNextScreen, x, y, sz, sz, CopyROP, true);
+ }
+ showNextScreen();
+
+ return -1;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectGrowing(bool aInit)
+{
+ if (aInit)
+ {
+ mw = width();
+ mh = height();
+ mx = mw >> 1;
+ my = mh >> 1;
+ mi = 0;
+ mfx = mx / 100.0;
+ mfy = my / 100.0;
+ }
+
+ mx = (mw>>1) - (int)(mi * mfx);
+ my = (mh>>1) - (int)(mi * mfy);
+ mi++;
+
+ if (mx<0 || my<0)
+ {
+ showNextScreen();
+ return -1;
+ }
+
+ bitBlt(this, mx, my, &mNextScreen, mx, my,
+ mw - (mx<<1), mh - (my<<1), CopyROP, true);
+
+ return 20;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectChessboard(bool aInit)
+{
+ int y;
+
+ if (aInit)
+ {
+ mw = width();
+ mh = height();
+ mdx = 8; // width of one tile
+ mdy = 8; // height of one tile
+ mj = (mw+mdx-1)/mdx; // number of tiles
+ mx = mj*mdx; // shrinking x-offset from screen border
+ mix = 0; // growing x-offset from screen border
+ miy = 0; // 0 or mdy for growing tiling effect
+ my = mj&1 ? 0 : mdy; // 0 or mdy for shrinking tiling effect
+ mwait = 800 / mj; // timeout between effects
+ }
+
+ if (mix >= mw)
+ {
+ showNextScreen();
+ return -1;
+ }
+
+ mix += mdx;
+ mx -= mdx;
+ miy = miy ? 0 : mdy;
+ my = my ? 0 : mdy;
+
+ for (y=0; y<mw; y+=(mdy<<1))
+ {
+ bitBlt(this, mix, y+miy, &mNextScreen, mix, y+miy,
+ mdx, mdy, CopyROP, true);
+ bitBlt(this, mx, y+my, &mNextScreen, mx, y+my,
+ mdx, mdy, CopyROP, true);
+ }
+
+ return mwait;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectIncomingEdges(bool aInit)
+{
+ int x1, y1;
+
+ if (aInit)
+ {
+ mw = width();
+ mh = height();
+ mix = mw >> 1;
+ miy = mh >> 1;
+ mfx = mix / 100.0;
+ mfy = miy / 100.0;
+ mi = 0;
+ mSubType = KApplication::random() & 1;
+ }
+
+ mx = (int)(mfx * mi);
+ my = (int)(mfy * mi);
+
+ if (mx>mix || my>miy)
+ {
+ showNextScreen();
+ return -1;
+ }
+
+ x1 = mw - mx;
+ y1 = mh - my;
+ mi++;
+
+ if (mSubType)
+ {
+ // moving image edges
+ bitBlt(this, 0, 0, &mNextScreen, mix-mx, miy-my, mx, my, CopyROP, true);
+ bitBlt(this, x1, 0, &mNextScreen, mix, miy-my, mx, my, CopyROP, true);
+ bitBlt(this, 0, y1, &mNextScreen, mix-mx, miy, mx, my, CopyROP, true);
+ bitBlt(this, x1, y1, &mNextScreen, mix, miy, mx, my, CopyROP, true);
+ }
+ else
+ {
+ // fixed image edges
+ bitBlt(this, 0, 0, &mNextScreen, 0, 0, mx, my, CopyROP, true);
+ bitBlt(this, x1, 0, &mNextScreen, x1, 0, mx, my, CopyROP, true);
+ bitBlt(this, 0, y1, &mNextScreen, 0, y1, mx, my, CopyROP, true);
+ bitBlt(this, x1, y1, &mNextScreen, x1, y1, mx, my, CopyROP, true);
+ }
+ return 20;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectHorizLines(bool aInit)
+{
+ static int iyPos[] = { 0, 4, 2, 6, 1, 5, 3, 7, -1 };
+ int y;
+
+ if (aInit)
+ {
+ mw = width();
+ mh = height();
+ mi = 0;
+ }
+
+ if (iyPos[mi] < 0) return -1;
+
+ for (y=iyPos[mi]; y<mh; y+=8)
+ {
+ bitBlt(this, 0, y, &mNextScreen, 0, y, mw, 1, CopyROP, true);
+ }
+
+ mi++;
+ if (iyPos[mi] >= 0) return 160;
+ return -1;
+}
+
+
+//----------------------------------------------------------------------------
+int kSlideShowSaver::effectVertLines(bool aInit)
+{
+ static int ixPos[] = { 0, 4, 2, 6, 1, 5, 3, 7, -1 };
+ int x;
+
+ if (aInit)
+ {
+ mw = width();
+ mh = height();
+ mi = 0;
+ }
+
+ if (ixPos[mi] < 0) return -1;
+
+ for (x=ixPos[mi]; x<mw; x+=8)
+ {
+ bitBlt(this, x, 0, &mNextScreen, x, 0, 1, mh, CopyROP, true);
+ }
+
+ mi++;
+ if (ixPos[mi] >= 0) return 160;
+ return -1;
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSaver::startPainter(Qt::PenStyle aPen)
+{
+ QBrush brush;
+ brush.setPixmap(mNextScreen);
+ if (mPainter.isActive()) mPainter.end();
+ mPainter.begin(this);
+ mPainter.setBrush(brush);
+ mPainter.setPen(aPen);
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSaver::restart()
+{
+ mEffectRunning = false;
+ mEffect = NULL;
+ blank();
+ slotTimeout();
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSaver::slotTimeout()
+{
+ int tmout = -1;
+ int i;
+
+ if (mEffectRunning)
+ {
+ tmout = (this->*mEffect)(false);
+ }
+ else
+ {
+ loadNextImage();
+ createNextScreen();
+
+ if (mNumEffects > 1) i = KApplication::random() % mNumEffects;
+ else i = 0;
+
+ mEffect = mEffectList[i];
+ mEffectRunning = true;
+ tmout = (this->*mEffect)(true);
+ }
+ if (tmout <= 0)
+ {
+ tmout = mDelay;
+ mEffectRunning = false;
+ }
+ mTimer.start(tmout, true);
+}
+
+
+//----------------------------------------------------------------------------
+void kSlideShowSaver::showNextScreen()
+{
+ bitBlt(this, 0, 0, &mNextScreen, 0, 0,
+ mNextScreen.width(), mNextScreen.height(), CopyROP, true);
+}
+
+
+//----------------------------------------------------------------------------
+void kSlideShowSaver::createNextScreen()
+{
+ QPainter p;
+ int ww, wh, iw, ih, x, y;
+ double fx, fy;
+
+ if (mNextScreen.size() != size())
+ mNextScreen.resize(size());
+
+ mNextScreen.fill(black);
+
+ p.begin(&mNextScreen);
+
+ mScreenGeo *geoptr = 0;
+ for(geoptr = mGeoList.first(); geoptr; geoptr = mGeoList.next())
+ {
+ loadNextImage();
+
+ iw = mImage.width();
+ ih = mImage.height();
+ ww = geoptr->mW;
+ wh = geoptr->mH;
+
+ if (mFileList.isEmpty())
+ {
+ p.setPen(QColor("white"));
+ p.drawText(20 + (KApplication::random() % (ww>>1)), 20 + (KApplication::random() % (wh>>1)),
+ i18n("No images found"));
+ }
+ else
+ {
+ if (mZoomImages)
+ {
+ fx = (double)ww / iw;
+ fy = (double)wh / ih;
+ if (fx > fy) fx = fy;
+ if (fx > 2) fx = 2;
+ iw = (int)(iw * fx);
+ ih = (int)(ih * fx);
+ QImage scaledImg = mImage.smoothScale(iw, ih);
+
+ x = ((ww - iw) >> 1) + geoptr->mXorg;
+ y = ((wh - ih) >> 1) + geoptr->mYorg;
+
+ p.drawImage(x, y, scaledImg);
+ }
+ else
+ {
+ if(iw >= ww || ih >= wh)
+ {
+ fx = (double)ww / iw;
+ fy = (double)wh / ih;
+ if (fx > fy) fx = fy;
+ if (fx > 2) fx = 2;
+ iw = (int)(iw * fx);
+ ih = (int)(ih * fx);
+ QImage scaledImg = mImage.smoothScale(iw, ih);
+
+ x = ((ww - iw) >> 1) + geoptr->mXorg;
+ y = ((wh - ih) >> 1) + geoptr->mYorg;
+
+ p.drawImage(x, y, scaledImg);
+ }
+ else
+ {
+ if(mRandomPosition)
+ {
+ x = (KApplication::random() % (ww - iw)) + geoptr->mXorg;
+ y = (KApplication::random() % (wh - ih)) + geoptr->mYorg;
+ }
+ else
+ {
+ x = ((ww - iw) >> 1) + geoptr->mXorg;
+ y = ((wh - ih) >> 1) + geoptr->mYorg;
+ }
+
+ // bitBlt(&mNextScreen, x, y, &mImage, 0, 0, iw, ih, CopyROP, false);
+ p.drawImage(x, y, mImage);
+ }
+ }
+
+ if (mPrintName)
+ {
+ p.setPen(QColor("black"));
+ for (x=9; x<=11; x++)
+ for (y=21; y>=19; y--)
+ p.drawText(x + geoptr->mXorg, wh-y+geoptr->mYorg, mImageName);
+ p.setPen(QColor("white"));
+ p.drawText(10 + geoptr->mXorg, wh-20 + geoptr->mYorg, mImageName);
+ }
+ }
+ }
+ p.end();
+}
+
+
+//----------------------------------------------------------------------------
+void kSlideShowSaver::loadNextImage()
+{
+ QString fname;
+ int num;
+
+ num = mFileList.count();
+ if (num <= 0) //no files in the directory
+ {
+ return;
+ }
+
+ if (mShowRandom)
+ {
+ mFileIdx = KApplication::random() % num;
+ fname = mFileList[mFileIdx];
+ mFileList.remove(fname);
+ if (num == 1) //we're about to run out of images
+ {
+ mFileList = mRandomList;
+ }
+ }
+ else
+ {
+ if (mFileIdx >= num) mFileIdx = 0;
+ fname = mFileList[mFileIdx];
+ }
+
+ if (!mImage.load(fname))
+ {
+ kdDebug() << "Failed to load image " << fname << endl;
+ mFileList.remove(fname);
+ mRandomList.remove(fname);
+ if (!mFileList.isEmpty())
+ loadNextImage();
+ return;
+ }
+ mFileIdx++;
+
+ int i, j;
+ i = fname.findRev('.');
+ if (i < 0) i = 32767;
+ j = fname.findRev('/') + 1;
+ if (j < 0) j = 0;
+ mImageName = fname.mid(j, i-j);
+}
+
+
+//----------------------------------------------------------------------------
+void kSlideShowSaver::loadDirectory()
+{
+ mFileIdx = 0;
+ mFileList.clear();
+ traverseDirectory(mDirectory);
+ mRandomList = mFileList;
+}
+
+void kSlideShowSaver::traverseDirectory(const QString &dirName)
+{
+ QDir dir(dirName);
+ if (!dir.exists())
+ {
+ return ;
+ }
+ dir.setFilter(QDir::Dirs | QDir::Files);
+
+ const QFileInfoList *fileinfolist = dir.entryInfoList();
+ QFileInfoListIterator it(*fileinfolist);
+ QFileInfo *fi;
+ while ((fi = it.current()))
+ {
+ if (fi->fileName() == "." || fi->fileName() == "..")
+ {
+ ++it;
+ continue;
+ }
+ if (fi->isDir() && fi->isReadable() && mSubdirectory)
+ {
+ traverseDirectory(fi->filePath());
+ }
+ else
+ {
+ if (!fi->isDir())
+ {
+ mFileList.append(fi->filePath());
+ }
+ }
+ ++it;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSaver::blank()
+{
+ erase();
+}
+
+
+//=============================================================================
+// Class kSlideShowSetup
+//=============================================================================
+kSlideShowSetup::kSlideShowSetup(QWidget *aParent, const char *aName)
+ : KDialogBase(aParent, aName, true, i18n( "Setup Slide Show Screen Saver" ),
+ Ok|Cancel|Help, Ok, true )
+{
+ setButtonText( Help, i18n( "A&bout" ) );
+
+ QWidget *main = makeMainWidget();
+ QVBoxLayout *top = new QVBoxLayout( main, 0, spacingHint() );
+
+ cfg = new SlideShowCfg( main, "SlideShowCfg" );
+ top->addWidget( cfg );
+ top->addStretch();
+
+ cfg->mPreview->setFixedSize(220, 170);
+ cfg->mPreview->setBackgroundColor(black);
+ cfg->mPreview->show(); // otherwise saver does not get correct size
+ mSaver = new kSlideShowSaver(cfg->mPreview->winId());
+
+ cfg->mDirChooser->setMode(KFile::Directory | KFile::ExistingOnly);
+ connect(cfg->mDirChooser, SIGNAL(returnPressed(const QString &)),
+ SLOT(slotDirSelected(const QString &)));
+ connect(cfg->mDirChooser, SIGNAL(urlSelected(const QString &)),
+ SLOT(slotDirSelected(const QString &)));
+
+ readSettings();
+}
+
+kSlideShowSetup::~kSlideShowSetup()
+{
+ delete mSaver;
+}
+
+//-----------------------------------------------------------------------------
+void kSlideShowSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+
+ config->setGroup("Settings");
+ cfg->mCbxRandom->setChecked(config->readBoolEntry("ShowRandom", true));
+ cfg->mCbxZoom->setChecked(config->readBoolEntry("ZoomImages", false));
+ cfg->mCbxShowName->setChecked(config->readBoolEntry("PrintName", true));
+ cfg->mDelay->setValue(config->readNumEntry("Delay", 20));
+ cfg->mDirChooser->setURL(config->readPathEntry("Directory"));
+ cfg->mCbxSubdirectory->setChecked(config->readBoolEntry("SubDirectory", false));
+ cfg->mCbxRandomPosition->setChecked(config->readBoolEntry("RandomPosition", false));
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSetup::writeSettings()
+{
+ KConfig *config = KGlobal::config();
+
+ config->setGroup("Settings");
+ config->writeEntry("ShowRandom", cfg->mCbxRandom->isChecked());
+ config->writeEntry("ZoomImages", cfg->mCbxZoom->isChecked());
+ config->writeEntry("PrintName", cfg->mCbxShowName->isChecked());
+ config->writeEntry("Delay", cfg->mDelay->value());
+ config->writePathEntry("Directory", cfg->mDirChooser->url());
+ config->writeEntry("SubDirectory", cfg->mCbxSubdirectory->isChecked());
+ config->writeEntry("RandomPosition", cfg->mCbxRandomPosition->isChecked());
+
+ config->sync();
+
+ if (mSaver)
+ {
+ mSaver->readConfig();
+ mSaver->restart();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSetup::slotDirSelected(const QString &)
+{
+ writeSettings();
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSetup::slotOk()
+{
+ writeSettings();
+ accept();
+}
+
+
+//-----------------------------------------------------------------------------
+void kSlideShowSetup::slotHelp()
+{
+ KAboutData aboutData( "kslideshow.kss", I18N_NOOP("SlideShow"),
+ version, description, KAboutData::License_GPL,
+ "(c) 1999-2003, The KDE Team" );
+ aboutData.addAuthor("Stefan Taferner", 0, "taferner@kde.org");
+ aboutData.addAuthor("Chris Howells", 0, "howells@kde.org");
+ aboutData.addAuthor("Sven Leiber", 0, "s.leiber@web.de");
+
+ KAboutApplication mAbout(&aboutData, this, 0);
+ mAbout.exec();
+}
diff --git a/kscreensaver/kdesavers/slideshow.h b/kscreensaver/kdesavers/slideshow.h
new file mode 100644
index 00000000..fa51670a
--- /dev/null
+++ b/kscreensaver/kdesavers/slideshow.h
@@ -0,0 +1,150 @@
+/* Slide Show Screen Saver
+ * (C) 1999 Stefan Taferner <taferner@kde.org>
+ * (C) 2003 Sven Leiber <s.leiber@web.de>
+ */
+
+
+#ifndef SLIDESHOW_H
+#define SLIDESHOW_H
+
+#include <qtimer.h>
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <qimage.h>
+
+#include <kscreensaver.h>
+#include <kdialogbase.h>
+
+#include "slideshowcfg.h"
+
+class SlideShowCfg;
+
+//-----------------------------------------------------------------------------
+class kSlideShowSaver: public KScreenSaver
+{
+ Q_OBJECT
+public:
+ kSlideShowSaver( WId id );
+ virtual ~kSlideShowSaver();
+
+ typedef int (kSlideShowSaver::*EffectMethod)(bool);
+
+ void readConfig();
+
+ void restart();
+
+protected slots:
+ void slotTimeout();
+
+protected:
+ void blank();
+
+ /** Load list of images from directory */
+ virtual void loadDirectory();
+
+ /** Helper for loadDirectory() */
+ virtual void traverseDirectory(const QString &dirName);
+
+ /** Load next image from list. If the file cannot be read
+ it is automatically removed from the file list.
+ mImage contains the image after loading. */
+ virtual void loadNextImage();
+
+ /** Show next screen, completely, without transition. */
+ virtual void showNextScreen();
+
+ /** Set loaded image to next-screen buffer. */
+ virtual void createNextScreen();
+
+ /** Initialize next-screen buffer. */
+ virtual void initNextScreen();
+
+ /** Register effect methods in effect list. */
+ virtual void registerEffects();
+
+ /** Various effects. If adding one, do not forget to manually
+ add the effect to the list in the registerEffects() method. */
+ int effectHorizLines(bool doInit);
+ int effectVertLines(bool doInit);
+ int effectRandom(bool doInit);
+ int effectGrowing(bool doInit);
+ int effectChessboard(bool doInit);
+ int effectIncomingEdges(bool doInit);
+ int effectBlobs(bool doInit);
+ int effectCircleOut(bool doInit);
+ int effectSweep(bool doInit);
+ int effectMeltdown(bool doInit);
+ int effectSpiralIn(bool doInit);
+ int effectMultiCircleOut(bool doInit);
+
+protected:
+ /** Init mPainter with next-screen's pixmap and call
+ mPainter.begin(&mWidget) */
+ void startPainter(Qt::PenStyle penStyle=NoPen);
+
+protected:
+ struct mScreenGeo {
+ mScreenGeo(int w, int h, int x, int y) : mW(w), mH(h), mXorg(x), mYorg(y) {};
+ int mW;
+ int mH;
+ int mXorg;
+ int mYorg;
+ };
+ QPtrList<mScreenGeo> mGeoList;
+ bool mEffectRunning;
+ QTimer mTimer;
+ int mColorContext;
+ QStringList mFileList;
+ QStringList mRandomList;
+ int mFileIdx;
+ QImage mImage;
+ QPixmap mNextScreen;
+ EffectMethod* mEffectList;
+ EffectMethod mEffect;
+ int mNumEffects;
+ QPainter mPainter;
+ QString mImageName;
+
+ // config settings:
+ bool mShowRandom;
+ bool mZoomImages;
+ bool mPrintName;
+ bool mSubdirectory;
+ bool mRandomPosition;
+ int mDelay;
+ QString mDirectory;
+
+ // values for state of various effects:
+ int mx, my, mw, mh, mdx, mdy, mix, miy, mi, mj, mSubType;
+ int mx0, my0, mx1, my1, mwait;
+ double mfx, mfy, mAlpha, mfd;
+ int* mIntArray;
+};
+
+
+//-----------------------------------------------------------------------------
+class kSlideShowSetup : public KDialogBase
+{
+ Q_OBJECT
+public:
+ kSlideShowSetup(QWidget *parent=NULL, const char *name=NULL);
+ ~kSlideShowSetup();
+
+protected:
+ void readSettings();
+
+protected slots:
+ void slotOk();
+ void slotHelp();
+ void writeSettings();
+ void slotDirSelected(const QString &where);
+
+private:
+ kSlideShowSaver *mSaver;
+ SlideShowCfg *cfg;
+};
+
+#endif /*SLIDESHOW_H*/
+
diff --git a/kscreensaver/kdesavers/slideshowcfg.ui b/kscreensaver/kdesavers/slideshowcfg.ui
new file mode 100644
index 00000000..544ea60b
--- /dev/null
+++ b/kscreensaver/kdesavers/slideshowcfg.ui
@@ -0,0 +1,176 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>SlideShowCfg</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>243</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QCheckBox" row="7" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>mCbxSubdirectory</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Include images from sub-folders</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>mCbxRandom</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Random order</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="6" column="2" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>mDirChooser</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>mCbxZoom</cstring>
+ </property>
+ <property name="text">
+ <string>Resi&amp;ze images</string>
+ </property>
+ </widget>
+ <spacer row="7" column="4">
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>161</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="6" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>I&amp;mage folder:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mDirChooser</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>mCbxShowName</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;names</string>
+ </property>
+ </widget>
+ <spacer row="5" column="1">
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>19</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="4" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>mDelay</cstring>
+ </property>
+ <property name="suffix">
+ <string> sec</string>
+ </property>
+ <property name="specialValueText">
+ <string></string>
+ </property>
+ <property name="maxValue">
+ <number>240</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delay:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mDelay</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>mCbxRandomPosition</cstring>
+ </property>
+ <property name="text">
+ <string>Random &amp;position</string>
+ </property>
+ </widget>
+ <widget class="QFrame" row="0" column="3" rowspan="6" colspan="2">
+ <property name="name">
+ <cstring>mPreview</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>mCbxZoom</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mCbxRandomPosition</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kscreensaver/kdesavers/sspreviewarea.cpp b/kscreensaver/kdesavers/sspreviewarea.cpp
new file mode 100644
index 00000000..d189c409
--- /dev/null
+++ b/kscreensaver/kdesavers/sspreviewarea.cpp
@@ -0,0 +1,21 @@
+//============================================================================
+//
+// KRotation screen saver for KDE
+// Copyright (C) 2004 Georg Drenkhahn
+// $Id$
+//
+//============================================================================
+
+#include "sspreviewarea.h"
+#include "sspreviewarea.moc"
+
+SsPreviewArea::SsPreviewArea(QWidget* parent, const char* name)
+ : QWidget(parent, name)
+{
+}
+
+void SsPreviewArea::resizeEvent(QResizeEvent* e)
+{
+ emit resized(e);
+}
+
diff --git a/kscreensaver/kdesavers/sspreviewarea.h b/kscreensaver/kdesavers/sspreviewarea.h
new file mode 100644
index 00000000..5b14f09d
--- /dev/null
+++ b/kscreensaver/kdesavers/sspreviewarea.h
@@ -0,0 +1,57 @@
+//============================================================================
+//
+// KRotation screen saver for KDE
+// Copyright (C) 2004 Georg Drenkhahn
+// $Id$
+//
+//============================================================================
+
+#ifndef SSPREVIEWAREA_H
+#define SSPREVIEWAREA_H
+
+#include <qwidget.h>
+
+/** @brief Reimplementation of QWidget emitting a signal if resized.
+ *
+ * This class is equalt to QWidget except for the fact that the signal resized()
+ * is emitted if the widget gets resized. By this signaling mechanism it is
+ * possible to resize the embedded GL area object within the screen saver setup
+ * dialog.
+ *
+ * In the constructor of the dialog widget (KPendulumSetup::KPendulumSetup(),
+ * KRotationSetup::KRotationSetup()) the signal SsPreviewArea::resized() is
+ * connected with a slot of the screensaver class
+ * (KPendulumSaver::resizeGlArea(), KRotationSaver::resizeGlArea()). This slot
+ * function calls the reimplemented QGLWidget::resizeGL() method of the GL
+ * widgets (PendulumGLWidget::resizeGL(), RotationGLWidget::resizeGL()) which
+ * really resizes the GL scenery. */
+class SsPreviewArea : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ /** @brief Constructor for SsPreviewArea
+ * @param parent Pointer tp parent widget, forwarded to the QWidget
+ * constructor
+ * @param name Pointer to widget name, forwarded to the QWidget constructor
+ *
+ * The constructor just calls QWidget::QWidget() with the given arguments.
+ */
+ SsPreviewArea(QWidget* parent = NULL, const char* name = NULL);
+
+ protected:
+ /** @brief Called if widget gets resized.
+ * @param e Pointer to the corresponding QResizeEvent object containing the
+ * resize information
+ *
+ * Reimplemented event handler from QWidget. Only the signal resized() is
+ * emitted. */
+ virtual void resizeEvent(QResizeEvent* e);
+
+ signals:
+ /** @brief Signal which is emitted in the resizeEvent() method.
+ * @param e Pointer to the corresponding QResizeEvent object */
+ void resized(QResizeEvent* e);
+};
+
+#endif
diff --git a/kscreensaver/kdesavers/vec3.cpp b/kscreensaver/kdesavers/vec3.cpp
new file mode 100644
index 00000000..c66730e5
--- /dev/null
+++ b/kscreensaver/kdesavers/vec3.cpp
@@ -0,0 +1,105 @@
+//============================================================================
+//
+// 3-dim real vector class
+// $Id$
+// Copyright (C) 2004 Georg Drenkhahn
+//
+// This file is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+//============================================================================
+
+#include <math.h>
+#if !defined(NAN)
+static inline double nan__()
+{
+ static const unsigned int one = 1;
+ static const bool BigEndian = (*((unsigned char *) &one) == 0);
+
+ static const unsigned char be_nan_bytes[] = { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 };
+ static const unsigned char le_nan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f };
+
+ return *( ( const double * )( BigEndian ? be_nan_bytes : le_nan_bytes ) );
+}
+# define NAN (::nan__())
+#endif
+
+#include <config.h>
+
+#ifdef HAVE_NUMERIC_LIMITS
+#include <limits>
+#endif
+
+#include <cerrno>
+#include "vec3.h"
+
+template<typename T>
+vec3<T>& vec3<T>::normalize()
+{
+ T n = norm(*this);
+ if (n != 0)
+ {
+ (*this) /= n;
+ }
+ else
+ {
+ errno = EDOM; // indicate domain error
+ // TODO: throw an exception?
+ }
+ return *this;
+}
+
+template<typename T>
+vec3<T>& vec3<T>::rotate(const vec3<T>& r)
+{
+ T phi = norm(r);
+ if (phi != 0)
+ {
+ // part of vector which is parallel to r
+ vec3<T> par(r*(*this)/(r*r) * r);
+ // part of vector which is perpendicular to r
+ vec3<T> perp(*this - par);
+ // rotation direction, size of perp
+ vec3<T> rotdir(norm(perp) * normalized(crossprod(r,perp)));
+ *this = par + cos(phi)*perp + sin(phi)*rotdir;
+ }
+ return *this;
+}
+
+/*--- static member functions ---*/
+
+template<typename T>
+T vec3<T>::cos_angle(const vec3<T>& a, const vec3<T>& b)
+{
+ T den = norm(a) * norm(b);
+ T ret = 0;
+ // if |a|=0 or |b|=0 then angle is not defined. We return NAN in this case.
+ if (den != 0.0)
+ {
+ ret = a*b/den;
+ }
+ else
+ {
+ errno = EDOM; // indicate domain error
+#ifdef HAVE_NUMERIC_LIMITS
+ // TODO test
+ ret = std::numeric_limits<T>::quiet_NaN();
+#else
+ ret = NAN; // return NAN from ISO C99
+#endif
+ }
+ return ret;
+}
+
+template<typename T>
+T vec3<T>::angle(const vec3<T>& a, const vec3<T>& b, const vec3<T>& c)
+{
+ // if |a|=0 or |b|=0 then angle is not defined. We return NAN in this case.
+ T ang = vec3<T>::angle(a,b);
+ return (crossprod(a,b)*c<0) ?
+ T(2.*M_PI)-ang : ang;
+}
+
+// explicite instantiation
+template class vec3<double>;
diff --git a/kscreensaver/kdesavers/vec3.h b/kscreensaver/kdesavers/vec3.h
new file mode 100644
index 00000000..62aeb8ed
--- /dev/null
+++ b/kscreensaver/kdesavers/vec3.h
@@ -0,0 +1,214 @@
+//============================================================================
+//
+// 3-dim real vector class
+// $Id$
+// Copyright (C) 2004 Georg Drenkhahn
+//
+// This file is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+//============================================================================
+
+#ifndef VEC3_H
+#define VEC3_H
+
+#include <valarray>
+
+/** @brief 3-dimensional real vector
+ *
+ * Implements regular 3 dimensional (space) vectors including the common inner
+ * scalar product (2 norm) and the cross product. @a T may be any integer or
+ * float data type which is an acceptable template argument of std::valarray. */
+template<typename T>
+class vec3 : public std::valarray<T>
+{
+ public:
+ /** Default constructor */
+ vec3();
+ /** Constructor with initial element values */
+ vec3(const T&, const T&, const T&);
+ /** Copy constructor */
+ vec3(const std::valarray<T>&);
+ /** Copy constructor */
+ vec3(const std::slice_array<T>&);
+
+ /** Normalize the vector to have a norm of 1. @return Normalized vector if
+ * length is non-zero and otherwise the zero vector. */
+ vec3& normalize();
+
+ /** Rotate the vector (*this) in positive mathematical direction around the
+ * direction given by @a r. The norm of @a r specifies the rotation angle in
+ * radians.
+ * @param r Rotation vector.
+ * @return Rotated vector. */
+ vec3& rotate(const vec3& r);
+
+ /*--- static funcions ---*/
+
+ /** @param a first vector
+ * @param b second vector
+ * @return Cosine of the angle between @a a and @a b. If norm(@a a)==0 or
+ * norm(@a b)==0 the global variable errno is set to EDOM and NAN (or
+ * std::numeric_limits<T>::quiet_NaN()) is returned. */
+ static T cos_angle(const vec3& a, const vec3& b);
+
+ /** @brief Returns the angle between vectors @c a and @a b but with respect
+ * to a preferred rotation direction @a c.
+ *
+ * @param a First vector for angle. Must be | @a a |>0 otherwises NAN is
+ * returned.
+ * @param b Second vector for angle. Must be | @a b |>0 otherwises NAN is
+ * returned.
+ * @param c Indicates the rotation direction. @a c can be any vector which is
+ * not part of the plane spanned by @a a and @a b. If | @a c | = 0 the
+ * smalest possible angle angle is returned.
+ * @return Angle in radians between 0 and 2*Pi or NAN if | @a a |=0 or | @a b
+ * |=0.
+ *
+ * For @a a not parallel to @a b and @a a not antiparallel to @a b the 2
+ * vectors @a a,@a b span a unique plane in the 3-dimensional space. Let @b
+ * n<sub>1</sub> and @b n<sub>2</sub> be the two possible normal vectors for
+ * this plane with |@b n<sub>i</sub> |=1, i={1,2} and @b n<sub>1</sub> = -@b
+ * n<sub>2</sub> .
+ *
+ * Let further @a a and @a b enclose an angle alpha in [0,Pi], then there is
+ * one i in {1,2} so that (alpha*@b n<sub>i</sub> x @a a) * @a b = 0. This
+ * means @a a rotated by the rotation vector alpha*@b n<sub>i</sub> is
+ * parallel to @a b. One could also rotate @a a by (2*Pi-alpha)*(-@b
+ * n<sub>i</sub>) to acomplish the same transformation with
+ * ((2*Pi-alpha)*(-@b n<sub>i</sub>) x @a a) * @a b = 0
+ *
+ * The vector @a c defines the direction of the normal vector to take as
+ * reference. If @a c * @b n<sub>i</sub> > 0 alpha is returned and otherwise
+ * 2*Pi-alpha. If @a a parallel to @a b or @a a parallel to @a b the choice
+ * of @a c does not matter. */
+ static T angle(const vec3& a, const vec3& b, const vec3& c);
+
+ /*--- static inline funcions ---*/
+
+ /** Norm of argument vector.
+ * @param a vector.
+ * @return | @a a | */
+ static T norm(const vec3& a);
+
+ /** Angle between @a a and @a b.
+ * @param a fist vector. Must be | @a a | > 0 otherwises NAN is returned.
+ * @param b second vector. Must be | @a b | > 0 otherwises NAN is returned.
+ * @return Angle in radians between 0 and Pi or NAN if | @a a | = 0 or | @a b
+ * | = 0. */
+ static T angle(const vec3& a, const vec3& b);
+
+ /** Cross product of @a a and @a b.
+ * @param a fist vector.
+ * @param b second vector.
+ * @return Cross product of argument vectors @a a x @a b. */
+ static vec3 crossprod(const vec3& a, const vec3& b);
+
+ /** Normalized version of argument vector.
+ * @param a vector.
+ * @return @a a / | @a a | for | @a a | > 0 and otherwise the zero vector
+ * (=@a a). In the latter case the global variable errno is set to EDOM. */
+ static vec3 normalized(vec3 a);
+};
+
+/*--- inline member functions ---*/
+
+template<typename T>
+inline vec3<T>::vec3()
+ : std::valarray<T>(3)
+{}
+
+template<typename T>
+inline vec3<T>::vec3(const T& a, const T& b, const T& c)
+ : std::valarray<T>(3)
+{
+ (*this)[0] = a;
+ (*this)[1] = b;
+ (*this)[2] = c;
+}
+
+template<typename T>
+inline vec3<T>::vec3(const std::valarray<T>& a)
+ : std::valarray<T>(a)
+{
+}
+
+template<typename T>
+inline vec3<T>::vec3(const std::slice_array<T>& a)
+ : std::valarray<T>(a)
+{
+}
+
+/*--- inline non-member operators ---*/
+
+/** @param a first vector summand
+ * @param b second vector summand
+ * @return Sum vector of vectors @a a and @a b. */
+template<typename T>
+inline vec3<T> operator+(vec3<T> a, const vec3<T>& b)
+{
+ a += b; /* valarray<T>::operator+=(const valarray<T>&) */
+ return a;
+}
+
+/** @param a first vector multiplicant
+ * @param b second vector multiplicant
+ * @return Scalar product of vectors @a a and @a b. */
+template<typename T>
+inline T operator*(vec3<T> a, const vec3<T>& b)
+{
+ a *= b; /* valarray<T>::operator*=(const T&) */
+ return a.sum();
+}
+
+/** @param a scalar multiplicant
+ * @param b vector operand
+ * @return Product vector of scalar @a a and vector @a b. */
+template<typename T>
+inline vec3<T> operator*(const T& a, vec3<T> b)
+{
+ b *= a; /* valarray<T>::operator*=(const T&) */
+ return b;
+}
+
+/** @param a vector operand
+ * @param b scalar multiplicant
+ * @return Product vector of scalar @a b and vector @a a. */
+template<typename T>
+inline vec3<T> operator*(vec3<T> a, const T& b)
+{
+ return b*a; /* vec3<T>::operator*(const T&, vec3<T>) */
+}
+
+/*--- static inline funcions ---*/
+
+template<typename T>
+inline T vec3<T>::norm(const vec3<T>& a)
+{
+ return sqrt(a*a);
+}
+
+template<typename T>
+inline T vec3<T>::angle(const vec3<T>& a, const vec3<T>& b)
+{
+ // returns NAN if cos_angle() returns NAN (TODO: test this case)
+ return acos(cos_angle(a,b));
+}
+
+template<typename T>
+inline vec3<T> vec3<T>::crossprod(const vec3<T>& a, const vec3<T>& b)
+{
+ return vec3<T>(
+ a[1]*b[2] - a[2]*b[1],
+ a[2]*b[0] - a[0]*b[2],
+ a[0]*b[1] - a[1]*b[0]);
+}
+
+template<typename T>
+inline vec3<T> vec3<T>::normalized(vec3<T> a)
+{
+ return a.normalize();
+}
+
+#endif
diff --git a/kscreensaver/kdesavers/vm.c b/kscreensaver/kdesavers/vm.c
new file mode 100644
index 00000000..6d4a1af2
--- /dev/null
+++ b/kscreensaver/kdesavers/vm.c
@@ -0,0 +1,264 @@
+/*
+ * vm.c
+ *
+ * Copyright (c) 2000 Artur Rataj
+ * Distributed under the terms of the GNU General Public License
+ *
+ */
+
+#include "vm.h"
+
+#define ERROR_VALUE INT_MAX
+
+int vm_init_pool( struct tvm_pool** pool,
+ int area_size,
+ int max_stack_size,
+ int max_threads_num ) {
+ int position;
+
+ ( *pool ) = (struct tvm_pool*)malloc( sizeof(struct tvm_pool) );
+ ( *pool )->area_size = area_size;
+ ( *pool )->area = (int*)malloc( (*pool)->area_size*sizeof(int) );
+ ( *pool )->processes = NULL;
+ ( *pool )->max_stack_size = max_stack_size;
+ ( *pool )->max_threads_num = max_threads_num;
+ vm_enable_reverse( *pool, 0 );
+ for( position = 0; position < (*pool)->area_size; ++position )
+ ( *pool )->area[position] = VM_OP_STOP;
+ return 1;
+}
+
+void vm_done_pool( struct tvm_pool* pool ) {
+ struct tvm_process* curr_process;
+ free( pool->area );
+ curr_process = pool->processes;
+ while( curr_process ) {
+ struct tvm_process* tmp_process;
+
+ tmp_process = curr_process;
+ curr_process = curr_process->next;
+ free( tmp_process->stack );
+ free( tmp_process );
+ }
+ free( pool );
+}
+
+static int push( struct tvm_pool* pool,
+ struct tvm_process* process,
+ int value ) {
+ if( process->stack_top == pool->max_stack_size )
+ return ERROR_VALUE;
+ else
+ process->stack[process->stack_top++] = value;
+ return 1;
+}
+
+static int pop( struct tvm_pool* pool,
+ struct tvm_process* process ) {
+ if( process->stack_top == 0 )
+ return ERROR_VALUE;
+ else
+{
+ return process->stack[--process->stack_top];
+}
+}
+
+void vm_modify( struct tvm_pool* pool,
+ int position,
+ int op ) {
+ pool->area[position] = op;
+}
+
+void vm_exec( struct tvm_pool* pool,
+ int position,
+ int age,
+ int reverse ) {
+ struct tvm_process* new_process;
+
+ new_process = (struct tvm_process*)malloc( sizeof(struct tvm_process) );
+ new_process->position = position;
+ new_process->stack = (int*)malloc( pool->max_stack_size*sizeof(int) );
+ new_process->stack_top = 0;
+ new_process->age = age;
+ new_process->reverse = reverse;
+ new_process->next = pool->processes;
+ pool->processes = new_process;
+}
+
+void vm_enable_reverse( struct tvm_pool* pool,
+ const int enabled ) {
+ pool->reverse_enabled = enabled;
+}
+
+int vm_get_reverse( struct tvm_pool* pool ) {
+ if( pool->reverse_enabled )
+ return (int)( vm_random(&(pool->vm_random_data))*2.0/
+ ( VM_RAND_MAX + 1.0 ) );
+ else
+ return 0;
+}
+
+void vm_iterate( struct tvm_pool* pool,
+ char* modified ) {
+ struct tvm_process* prev_process;
+ struct tvm_process* curr_process;
+ struct tvm_process* next_process;
+ int processes_num;
+
+ processes_num = 0;
+ prev_process = NULL;
+ curr_process = pool->processes;
+ while( curr_process ) {
+ int op;
+ int arg;
+ int arg_2;
+ int arg_3;
+
+ ++curr_process->age;
+ next_process = curr_process->next;
+ op = pool->area[curr_process->position];
+ if( curr_process->reverse )
+ --curr_process->position;
+ else
+ ++curr_process->position;
+ curr_process->position = ( curr_process->position + pool->area_size )%
+ pool->area_size;
+ switch( op ) {
+ case VM_OP_WAIT:
+ break;
+
+ case VM_OP_STOP:
+ if( !prev_process )
+ pool->processes = curr_process->next;
+ else
+ prev_process->next = curr_process->next;
+ free( curr_process->stack );
+ free( curr_process );
+ curr_process = prev_process;
+ --processes_num;
+ break;
+
+ case VM_OP_EXEC:
+ if( (arg = pop( pool, curr_process )) == ERROR_VALUE ) {
+ if( !prev_process )
+ pool->processes = curr_process->next;
+ else
+ prev_process->next = curr_process->next;
+ free( curr_process->stack );
+ free( curr_process );
+ curr_process = prev_process;
+ --processes_num;
+ } else {
+ arg = curr_process->position + arg;
+ if( arg < 0 )
+ arg += pool->area_size;
+ if( arg >= pool->area_size )
+ arg -= pool->area_size;
+ vm_exec( pool, arg, curr_process->age, vm_get_reverse(pool) );
+ }
+ break;
+
+ case VM_OP_COPY:
+ if( (arg = pop( pool, curr_process )) == ERROR_VALUE ) {
+ if( !prev_process )
+ pool->processes = curr_process->next;
+ else
+ prev_process->next = curr_process->next;
+ free( curr_process->stack );
+ free( curr_process );
+ curr_process = prev_process;
+ --processes_num;
+ } else if( (arg_2 = pop( pool, curr_process )) == ERROR_VALUE ) {
+ if( !prev_process )
+ pool->processes = curr_process->next;
+ else
+ prev_process->next = curr_process->next;
+ free( curr_process->stack );
+ free( curr_process );
+ curr_process = prev_process;
+ --processes_num;
+ } else if( 1 && (arg_3 = pop( pool, curr_process )) == ERROR_VALUE ) {
+ if( !prev_process )
+ pool->processes = curr_process->next;
+ else
+ prev_process->next = curr_process->next;
+ free( curr_process->stack );
+ free( curr_process );
+ curr_process = prev_process;
+ --processes_num;
+ } else {
+ int count;
+ int direction;
+
+ arg = curr_process->position + arg;
+ if( arg < 0 )
+ arg += pool->area_size;
+ if( arg >= pool->area_size )
+ arg -= pool->area_size;
+ arg_2 = curr_process->position + arg_2;
+ if( arg_2 < 0 )
+ arg_2 += pool->area_size;
+ if( arg_2 >= pool->area_size )
+ arg_2 -= pool->area_size;
+ if( curr_process->reverse )
+ direction = -1;
+ else
+ direction = 1;
+ for( count = 0; count < arg_3; ++count ) {
+ int i, j;
+ int offset;
+
+ offset = count*direction + pool->area_size;
+ i = pool->area[( arg_2 + offset )%pool->area_size];
+ j = pool->area[( arg_2 + offset )%pool->area_size] = pool->area[( arg + offset )%pool->area_size];
+ if( modified && i != j )
+ modified[( arg_2 + offset )%pool->area_size] = 1;
+ }
+ }
+ break;
+
+ default: /* >= VM_OP_PUSH */
+ arg = op - VM_OP_PUSH;
+ if( push(pool, curr_process, arg) == ERROR_VALUE ) {
+ if( !prev_process )
+ pool->processes = curr_process->next;
+ else
+ prev_process->next = curr_process->next;
+ free( curr_process->stack );
+ free( curr_process );
+ curr_process = prev_process;
+ --processes_num;
+ }
+ break;
+ }
+ prev_process = curr_process;
+ curr_process = next_process;
+ ++processes_num;
+ }
+ while( processes_num > pool->max_threads_num ) {
+ int process_num;
+ int curr_process_num;
+
+ process_num = (int)( vm_random(&(pool->vm_random_data))*1.0*processes_num/
+ ( VM_RAND_MAX + 1.0 ) );
+/*
+ process_num = (int)( rand()*1.0*processes_num/
+ ( RAND_MAX + 1.0 ) );
+ */
+ curr_process_num = 0;
+ curr_process = pool->processes;
+ prev_process = NULL;
+ while( curr_process_num != process_num ) {
+ prev_process = curr_process;
+ curr_process = curr_process->next;
+ ++curr_process_num;
+ }
+ if( prev_process )
+ prev_process->next = curr_process->next;
+ else
+ pool->processes = curr_process->next;
+ free( curr_process->stack );
+ free( curr_process );
+ --processes_num;
+ }
+}
diff --git a/kscreensaver/kdesavers/vm.h b/kscreensaver/kdesavers/vm.h
new file mode 100644
index 00000000..dc64d241
--- /dev/null
+++ b/kscreensaver/kdesavers/vm.h
@@ -0,0 +1,52 @@
+#ifndef __VM_H__
+#define __VM_H__
+
+#include <stdlib.h>
+#include <stdio.h> /* !!! */
+#include <limits.h>
+#include "vm_random.h"
+
+#define VM_OP_STOP 1
+#define VM_OP_COPY 2
+#define VM_OP_EXEC 3
+#define VM_OP_WAIT 4
+#define VM_OP_PUSH (INT_MAX/2)
+
+struct tvm_process {
+ int position;
+ int* stack;
+ int stack_top;
+ int age;
+ int reverse;
+ struct tvm_process* next;
+};
+
+struct tvm_pool {
+ int* area;
+ int area_size;
+ struct tvm_process* processes;
+ int max_stack_size;
+ int max_threads_num;
+ int reverse_enabled;
+ struct vm_random_data vm_random_data;
+};
+
+int vm_init_pool( struct tvm_pool** pool,
+ int area_size,
+ int max_stack_size,
+ int max_threads_num );
+void vm_modify( struct tvm_pool* pool,
+ int position,
+ int op );
+void vm_exec( struct tvm_pool* pool,
+ int position,
+ int age,
+ int reverse );
+void vm_enable_reverse( struct tvm_pool* pool,
+ const int enabled );
+int vm_get_reverse( struct tvm_pool* pool );
+void vm_iterate( struct tvm_pool* pool,
+ char* modified );
+void vm_done_pool( struct tvm_pool* pool );
+
+#endif /* !defined( __VM_H__ ) */
diff --git a/kscreensaver/kdesavers/vm.xbm b/kscreensaver/kdesavers/vm.xbm
new file mode 100644
index 00000000..3d6e84cd
--- /dev/null
+++ b/kscreensaver/kdesavers/vm.xbm
@@ -0,0 +1,191 @@
+/* Created with The GIMP */
+#define vm_width 44
+#define vm_height 374
+static unsigned char vm_bits[] = {
+ 0x6d, 0xdb, 0xf6, 0xff, 0xff, 0x0f, 0xdb, 0xb6, 0x55, 0xdb, 0xb6, 0x0d,
+ 0x6d, 0x0b, 0xd0, 0xff, 0x07, 0x06, 0x5b, 0x1d, 0xd0, 0xdb, 0xee, 0x0c,
+ 0xf6, 0xf6, 0x77, 0xff, 0xbf, 0x0f, 0x8d, 0x4a, 0xd4, 0xd6, 0xba, 0x0d,
+ 0x05, 0x37, 0xe8, 0xd3, 0x4f, 0x0e, 0x27, 0x2c, 0xd1, 0x9a, 0xce, 0x0c,
+ 0x62, 0x1a, 0xd3, 0xdd, 0xeb, 0x0c, 0x52, 0x94, 0xa2, 0x39, 0xcf, 0x09,
+ 0x73, 0x9a, 0xd2, 0xde, 0xeb, 0x0e, 0xd2, 0x94, 0xd3, 0x39, 0xef, 0x09,
+ 0x53, 0x8a, 0x62, 0xdd, 0xa5, 0x0e, 0x62, 0x1c, 0xe3, 0x9a, 0xef, 0x0c,
+ 0x03, 0x16, 0xd0, 0xd5, 0x46, 0x0d, 0x0e, 0x75, 0xd8, 0xcb, 0x1f, 0x0d,
+ 0xdb, 0xae, 0x6a, 0x77, 0xff, 0x07, 0xd6, 0xaa, 0xed, 0xfe, 0xb6, 0x0e,
+ 0x5d, 0x5f, 0xdb, 0xf7, 0xff, 0x0f, 0x75, 0xf5, 0xd6, 0xbe, 0xb5, 0x0d,
+ 0xab, 0x95, 0xfa, 0xeb, 0xff, 0x07, 0x7a, 0xb7, 0xab, 0x7f, 0xb7, 0x0e,
+ 0xd7, 0x5a, 0xd5, 0xef, 0xfd, 0x0f, 0xad, 0x76, 0x77, 0xdd, 0xb7, 0x0d,
+ 0xf5, 0x0d, 0xd0, 0x7f, 0x47, 0x0c, 0x57, 0x1b, 0xd0, 0xf7, 0x5e, 0x0d,
+ 0x5a, 0xf5, 0xdb, 0xfe, 0xfb, 0x07, 0x6b, 0x97, 0xda, 0xad, 0xaf, 0x0e,
+ 0x85, 0x1a, 0xf4, 0xe5, 0x56, 0x0f, 0x87, 0x36, 0xa8, 0xe9, 0x1f, 0x0d,
+ 0x9a, 0xed, 0xec, 0xb7, 0x75, 0x0f, 0x16, 0x9b, 0xa8, 0xe7, 0x6f, 0x0d,
+ 0x8d, 0x76, 0xdc, 0xb7, 0x3f, 0x0f, 0x9d, 0xd5, 0xd4, 0xe6, 0x76, 0x0d,
+ 0x8b, 0xb6, 0xfc, 0xef, 0x5f, 0x0f, 0x9d, 0xad, 0xa4, 0xad, 0x5d, 0x0d,
+ 0x03, 0x34, 0xd0, 0xa5, 0x17, 0x0d, 0x06, 0x14, 0xc0, 0x91, 0x5e, 0x08,
+ 0xfd, 0xef, 0x7e, 0xff, 0xfb, 0x0f, 0xab, 0xaa, 0xe5, 0x77, 0xd7, 0x0f,
+ 0x6a, 0x5d, 0xdd, 0xdf, 0x7f, 0x0d, 0xde, 0xd5, 0x55, 0xfd, 0xf6, 0x0f,
+ 0x55, 0xb7, 0xf6, 0xef, 0xdf, 0x0a, 0xdb, 0xb6, 0xd6, 0x7d, 0xfb, 0x0f,
+ 0xb6, 0xea, 0xda, 0xef, 0x6f, 0x07, 0xb6, 0xaf, 0xb6, 0xbd, 0xfd, 0x0e,
+ 0x6d, 0x15, 0xd0, 0xef, 0x07, 0x0d, 0x5b, 0x1b, 0xd0, 0xfd, 0xae, 0x0c,
+ 0x76, 0xed, 0xdb, 0xef, 0xfb, 0x07, 0x8d, 0x5b, 0x5a, 0x5b, 0x5f, 0x0f,
+ 0x05, 0x16, 0xf0, 0xe5, 0x8b, 0x0e, 0x23, 0x14, 0xd1, 0x4c, 0x6f, 0x0c,
+ 0x72, 0x9e, 0xd2, 0x9e, 0xb3, 0x0d, 0x56, 0xd4, 0xf2, 0xbd, 0xff, 0x0c,
+ 0x1b, 0xbb, 0xd0, 0xc7, 0x36, 0x0d, 0x1b, 0xd6, 0x50, 0xdf, 0x7f, 0x0e,
+ 0xc6, 0x35, 0xfe, 0xf1, 0x96, 0x0b, 0x42, 0x16, 0xc2, 0xab, 0xaf, 0x0d,
+ 0x01, 0x0a, 0x70, 0x94, 0x45, 0x0e, 0x03, 0x1e, 0xd0, 0xa9, 0x4b, 0x0c,
+ 0xfd, 0xd2, 0xeb, 0xfe, 0xff, 0x07, 0xab, 0x5e, 0xdd, 0x6f, 0xdd, 0x0e,
+ 0xed, 0xb5, 0xd5, 0xfd, 0xf7, 0x0f, 0x5b, 0xab, 0xb6, 0x6f, 0xbf, 0x0d,
+ 0xd6, 0x76, 0xdb, 0xfd, 0xed, 0x07, 0xb5, 0xd6, 0xd6, 0xdb, 0xdf, 0x0e,
+ 0xef, 0x5a, 0xdd, 0x7f, 0xfb, 0x0f, 0xaa, 0xb7, 0xd5, 0xee, 0xbf, 0x0d,
+ 0x5d, 0x15, 0xf0, 0x7b, 0x03, 0x0c, 0xeb, 0x16, 0x50, 0xff, 0xb7, 0x0d,
+ 0x5d, 0xfb, 0xeb, 0x6b, 0xff, 0x0e, 0x55, 0x4b, 0x5c, 0xef, 0xad, 0x0d,
+ 0x03, 0x1d, 0xf0, 0xd1, 0x4f, 0x0e, 0x22, 0x14, 0xd1, 0x9d, 0xd6, 0x0c,
+ 0x57, 0x6e, 0xd3, 0xb6, 0xef, 0x0c, 0x3a, 0xda, 0xd0, 0x97, 0xbd, 0x0d,
+ 0x07, 0x55, 0xe8, 0xeb, 0x2f, 0x06, 0x2d, 0x5e, 0x51, 0x97, 0xfd, 0x0c,
+ 0x5d, 0xb4, 0xe2, 0x5f, 0xb7, 0x0d, 0x75, 0xea, 0xa3, 0x5d, 0xff, 0x09,
+ 0x03, 0x1a, 0xd0, 0xd6, 0x25, 0x0e, 0x02, 0x16, 0xf0, 0x88, 0xa7, 0x0c,
+ 0xef, 0xb5, 0xce, 0xf7, 0xdf, 0x0f, 0xad, 0xd6, 0xda, 0x7f, 0xbd, 0x0d,
+ 0xb5, 0xad, 0x6d, 0xef, 0xf7, 0x07, 0xb7, 0x6d, 0xeb, 0xdd, 0xdf, 0x0e,
+ 0xda, 0x5a, 0xdd, 0x7f, 0xfd, 0x0f, 0x56, 0xb7, 0xd5, 0xf6, 0xaf, 0x0d,
+ 0xfb, 0x6a, 0xdb, 0xdf, 0xfd, 0x0e, 0x56, 0xdb, 0xda, 0xfd, 0xed, 0x0d,
+ 0xb5, 0x0d, 0xd0, 0xb7, 0x07, 0x06, 0x6d, 0x1b, 0xd0, 0xfe, 0xdf, 0x0c,
+ 0xdb, 0xf6, 0xdb, 0xb7, 0xf6, 0x0f, 0xb6, 0x95, 0xda, 0xfe, 0xbf, 0x0d,
+ 0x0d, 0x7b, 0xe8, 0xc7, 0x36, 0x0f, 0x1b, 0xd6, 0xd8, 0xd6, 0x3f, 0x0c,
+ 0x06, 0x2b, 0xe8, 0xd3, 0x56, 0x0f, 0x25, 0x3a, 0xa8, 0xcb, 0x5f, 0x0d,
+ 0x23, 0x17, 0xe9, 0x6c, 0x4d, 0x0e, 0x23, 0x1a, 0xd9, 0xcd, 0x6b, 0x0d,
+ 0x02, 0x0b, 0xd0, 0xd4, 0x27, 0x0d, 0x02, 0x1a, 0xd0, 0x92, 0x26, 0x0d,
+ 0x2f, 0x76, 0xf0, 0xe7, 0x5f, 0x0e, 0x0a, 0x6a, 0xd0, 0x8e, 0x5d, 0x0c,
+ 0xfd, 0xad, 0xd7, 0xfb, 0xff, 0x07, 0x95, 0xb5, 0xb6, 0xff, 0xb5, 0x0f,
+ 0x7b, 0xd7, 0xda, 0xad, 0xff, 0x0e, 0x56, 0xbd, 0xb6, 0xff, 0xdb, 0x0d,
+ 0x75, 0xeb, 0xea, 0x5d, 0xff, 0x07, 0xd7, 0xaa, 0xae, 0xfb, 0xb6, 0x0e,
+ 0x5a, 0xd7, 0xf5, 0xff, 0xff, 0x0f, 0x76, 0x5d, 0xad, 0x6d, 0xab, 0x0d,
+ 0xad, 0x15, 0xd0, 0xff, 0x17, 0x0c, 0x6d, 0x17, 0x70, 0xdb, 0xd6, 0x0d,
+ 0xdb, 0xfa, 0xeb, 0xff, 0x7f, 0x07, 0xda, 0x96, 0xd6, 0xb6, 0xed, 0x0f,
+ 0x03, 0x2a, 0xd0, 0xc9, 0x17, 0x0c, 0x05, 0x1a, 0xd0, 0xa9, 0x4e, 0x0d,
+ 0xf3, 0x97, 0x6f, 0xfd, 0xeb, 0x0f, 0x02, 0x1a, 0xe8, 0xc5, 0x0f, 0x0d,
+ 0x03, 0x16, 0xd0, 0xaa, 0xad, 0x0c, 0x76, 0xb4, 0xd3, 0x9d, 0xff, 0x09,
+ 0x5b, 0x6e, 0xe1, 0xbf, 0x6a, 0x0d, 0x76, 0x58, 0x47, 0xb7, 0xff, 0x0d,
+ 0x01, 0x86, 0xf0, 0xcc, 0x26, 0x0c, 0x03, 0x1d, 0xd0, 0xc9, 0x4d, 0x0d,
+ 0xdd, 0x56, 0xed, 0xf7, 0xf7, 0x0f, 0xb5, 0x6d, 0xad, 0x7e, 0xbf, 0x0d,
+ 0xd7, 0xda, 0xda, 0xf7, 0xed, 0x07, 0xbd, 0xab, 0xdb, 0xaf, 0xbf, 0x0e,
+ 0x55, 0x5d, 0x75, 0xff, 0xed, 0x0f, 0xed, 0x75, 0xd7, 0xba, 0xff, 0x0d,
+ 0x5b, 0xab, 0xda, 0xff, 0x5a, 0x0f, 0xb6, 0x6e, 0xdb, 0xed, 0xff, 0x0d,
+ 0x6d, 0x1b, 0x70, 0xbf, 0x05, 0x06, 0x6b, 0x15, 0xd0, 0xf7, 0xaf, 0x0c,
+ 0xae, 0xdb, 0xeb, 0xbe, 0xfb, 0x0f, 0x5a, 0xb6, 0xda, 0x6f, 0x7f, 0x0d,
+ 0x05, 0x2a, 0xd0, 0xd2, 0x15, 0x0d, 0x47, 0x3e, 0xd0, 0xab, 0xaf, 0x0d,
+ 0xb1, 0x85, 0xef, 0xfc, 0xeb, 0x0e, 0x83, 0x1d, 0xd8, 0x65, 0x97, 0x0d,
+ 0x01, 0x0b, 0x68, 0xd4, 0x23, 0x0e, 0x23, 0x0a, 0xd1, 0x99, 0xe7, 0x0c,
+ 0x38, 0x8e, 0x71, 0xde, 0xf6, 0x06, 0x63, 0x1a, 0xe3, 0x9c, 0xc7, 0x0c,
+ 0x21, 0x16, 0xe8, 0xea, 0xad, 0x0e, 0x07, 0x35, 0xd8, 0xa3, 0x1f, 0x0d,
+ 0xad, 0xd7, 0xea, 0xfe, 0xfa, 0x0f, 0xb5, 0xb6, 0xd6, 0xef, 0xb7, 0x0d,
+ 0xdb, 0xda, 0x6d, 0x7b, 0xff, 0x07, 0xb6, 0xab, 0xda, 0xef, 0xad, 0x0e,
+ 0x6d, 0xdd, 0x76, 0xff, 0xff, 0x0f, 0xab, 0xd5, 0xea, 0xb6, 0xb5, 0x0d,
+ 0xdd, 0xae, 0xed, 0xff, 0xff, 0x07, 0xdb, 0xba, 0x55, 0xdb, 0xb6, 0x0e,
+ 0xb6, 0x15, 0xd0, 0xff, 0x47, 0x0c, 0x6d, 0x17, 0x70, 0xdb, 0xae, 0x0d,
+ 0xd5, 0xfa, 0xd7, 0xff, 0xff, 0x0e, 0xbd, 0x26, 0x6d, 0xdb, 0xda, 0x0d,
+ 0x03, 0x1c, 0xe0, 0xa1, 0x27, 0x0a, 0x02, 0x2a, 0x50, 0x97, 0xcf, 0x0c,
+ 0x77, 0x9a, 0xf3, 0x5d, 0xef, 0x0e, 0x6a, 0xb6, 0xa2, 0xbf, 0xdd, 0x0c,
+ 0x17, 0x6a, 0xf1, 0xca, 0x7f, 0x0d, 0x7d, 0xae, 0xd1, 0x5f, 0xeb, 0x0e,
+ 0x15, 0x5b, 0xe9, 0xef, 0x3f, 0x06, 0x37, 0x75, 0x59, 0x4d, 0xfb, 0x0e,
+ 0x9a, 0xd6, 0xd4, 0xf7, 0x2f, 0x0f, 0x96, 0xad, 0xd8, 0xe7, 0x7d, 0x0d,
+ 0x6d, 0xdb, 0x76, 0xbf, 0xff, 0x07, 0xdb, 0xb6, 0xd6, 0xfd, 0xd5, 0x0e,
+ 0xb6, 0xd5, 0xed, 0xb7, 0xff, 0x0f, 0xad, 0xb6, 0xda, 0xfe, 0xae, 0x0d,
+ 0x75, 0xdb, 0xd6, 0xdb, 0xfb, 0x07, 0x6f, 0xab, 0xb5, 0xff, 0xbf, 0x0e,
+ 0xaa, 0x5d, 0xdb, 0xad, 0xf5, 0x0f, 0xba, 0xd5, 0xd6, 0xff, 0xbf, 0x0d,
+ 0xd7, 0x0e, 0x70, 0xbb, 0x43, 0x0c, 0xb5, 0x1a, 0xd0, 0x77, 0x57, 0x0d,
+ 0xef, 0xed, 0xeb, 0xfe, 0xff, 0x07, 0x0a, 0x5b, 0xdc, 0xd7, 0xad, 0x0e,
+ 0x05, 0x15, 0xd0, 0x68, 0x8f, 0x0e, 0x23, 0x1e, 0xd1, 0x95, 0xad, 0x0c,
+ 0x79, 0x94, 0xf2, 0xde, 0xf7, 0x0c, 0x43, 0x96, 0xd2, 0x59, 0xc7, 0x0d,
+ 0x05, 0x2d, 0xd0, 0xca, 0x1d, 0x06, 0x05, 0x2a, 0xd8, 0xd3, 0x57, 0x0e,
+ 0x73, 0x8e, 0xd3, 0x9c, 0xe7, 0x0c, 0x52, 0x9a, 0xd2, 0xbd, 0xee, 0x0d,
+ 0x21, 0x16, 0x70, 0x95, 0xa3, 0x0c, 0x07, 0x2d, 0xd0, 0xd3, 0x1f, 0x0d,
+ 0x55, 0xdb, 0x76, 0xef, 0xf7, 0x0f, 0xdd, 0x56, 0xd5, 0xbd, 0xbe, 0x0d,
+ 0x6b, 0xdd, 0x76, 0xff, 0xeb, 0x07, 0xad, 0xd5, 0xd6, 0xdb, 0xbf, 0x0e,
+ 0x7b, 0xbb, 0xed, 0x7e, 0xef, 0x0f, 0x56, 0xab, 0xda, 0xf7, 0xfd, 0x0d,
+ 0x75, 0x6d, 0xeb, 0xde, 0x57, 0x0f, 0xd7, 0xdb, 0xda, 0xfd, 0xfe, 0x0d,
+ 0x5a, 0x15, 0xe0, 0xb7, 0x07, 0x06, 0x76, 0x17, 0x50, 0xff, 0xb7, 0x0c,
+ 0xad, 0xfa, 0xef, 0x6d, 0xfd, 0x0f, 0xcb, 0x27, 0xda, 0xfb, 0xaf, 0x0d,
+ 0x05, 0x1a, 0xe8, 0xa4, 0x0b, 0x0f, 0x22, 0x96, 0xd0, 0x55, 0x77, 0x0c,
+ 0x19, 0x8d, 0x69, 0xee, 0x73, 0x07, 0x71, 0x14, 0xe1, 0x9c, 0xe7, 0x0c,
+ 0x03, 0x8e, 0xf0, 0xc6, 0x16, 0x0e, 0x05, 0x1a, 0xc0, 0x95, 0xaf, 0x0c,
+ 0x2b, 0x6d, 0x79, 0xdb, 0xdd, 0x06, 0x3d, 0x5b, 0xd1, 0xdf, 0x7b, 0x0e,
+ 0x01, 0x15, 0xd8, 0x62, 0x97, 0x0e, 0x43, 0x17, 0xda, 0xea, 0x97, 0x0d,
+ 0xb5, 0xad, 0xf5, 0x7e, 0xeb, 0x0f, 0xad, 0xba, 0xd6, 0xed, 0xbf, 0x0d,
+ 0x7b, 0x6b, 0xed, 0xbf, 0xff, 0x07, 0xd6, 0xd6, 0x55, 0x7b, 0xb5, 0x0e,
+ 0xb5, 0xad, 0xee, 0xff, 0xff, 0x0f, 0x6d, 0xdb, 0x5a, 0xeb, 0xb6, 0x0d,
+ 0xdb, 0xb6, 0xf5, 0xbf, 0xff, 0x07, 0xb6, 0xad, 0x56, 0xfb, 0xb5, 0x0e,
+ 0x55, 0xdb, 0xed, 0xef, 0xff, 0x0f, 0xee, 0x16, 0xd0, 0xbe, 0x06, 0x0c,
+ 0xb5, 0x1a, 0xf0, 0xf7, 0x57, 0x0d, 0xd7, 0xd6, 0xcf, 0xfe, 0xfe, 0x0f,
+ 0xaa, 0x2d, 0xf8, 0xd5, 0xab, 0x0a, 0x03, 0x1b, 0xa0, 0xa5, 0x17, 0x0f,
+ 0x06, 0x35, 0xd8, 0xd5, 0xaf, 0x06, 0x0d, 0x6e, 0xd0, 0xab, 0x3d, 0x0e,
+ 0x25, 0x2a, 0x79, 0xdb, 0xd7, 0x0c, 0x67, 0x3a, 0xd3, 0x99, 0xce, 0x0d,
+ 0x02, 0x14, 0xe0, 0xa2, 0x17, 0x04, 0x03, 0x14, 0xc0, 0x2d, 0x57, 0x09,
+ 0x70, 0x08, 0x43, 0x5a, 0xea, 0x0a, 0x41, 0x08, 0xc2, 0x98, 0xc2, 0x01,
+ 0xf7, 0x7b, 0xdb, 0xff, 0x7f, 0x0f, 0xad, 0x56, 0xdb, 0xf7, 0xef, 0x0f,
+ 0xb5, 0x75, 0x75, 0x5f, 0xbd, 0x0e, 0xb7, 0x56, 0xd7, 0xfd, 0xf7, 0x0d,
+ 0xea, 0xed, 0xda, 0xf7, 0xbe, 0x07, 0x5e, 0xab, 0xd6, 0xde, 0x77, 0x0f,
+ 0xd5, 0x6e, 0xdd, 0xff, 0xfe, 0x0d, 0xb5, 0xda, 0xb5, 0xdb, 0xb7, 0x0f,
+ 0xef, 0x56, 0xeb, 0x7e, 0xfb, 0x06, 0xd5, 0x1a, 0xd0, 0xf7, 0x07, 0x0c,
+ 0xad, 0x0b, 0xd0, 0xde, 0xee, 0x0e, 0x7b, 0xfb, 0xf7, 0xfd, 0xdd, 0x0d,
+ 0x05, 0x0d, 0xa8, 0xeb, 0xb7, 0x0e, 0x03, 0x1a, 0x60, 0x09, 0x87, 0x08,
+ 0xa2, 0x14, 0xe5, 0xb5, 0x6f, 0x0d, 0xa7, 0x3c, 0xa5, 0x3b, 0xcd, 0x09,
+ 0x46, 0x14, 0xe2, 0xac, 0x6f, 0x0d, 0x05, 0x34, 0xc0, 0x91, 0x4e, 0x08,
+ 0xa5, 0x18, 0xc2, 0x6d, 0xab, 0x0b, 0xa7, 0x31, 0xce, 0x79, 0xce, 0x03,
+ 0x02, 0x0c, 0xc0, 0x4a, 0x17, 0x0a, 0x02, 0x18, 0xc0, 0x49, 0x57, 0x0a,
+ 0xfb, 0xf7, 0x7f, 0xff, 0xfd, 0x0f, 0x56, 0xad, 0xd4, 0xbf, 0xb7, 0x0d,
+ 0xad, 0x55, 0xeb, 0xfa, 0xfd, 0x0f, 0x7b, 0x77, 0xdd, 0xdf, 0x6f, 0x0d,
+ 0x55, 0xad, 0xeb, 0x76, 0xfb, 0x07, 0x6e, 0x6b, 0xd5, 0xff, 0x6f, 0x0f,
+ 0xb5, 0xfd, 0xff, 0xb6, 0xff, 0x0f, 0xb6, 0xfd, 0xff, 0x7f, 0xff, 0x0f,
+ 0x6d, 0xfb, 0x7f, 0xfb, 0xff, 0x0f, 0xdb, 0xfe, 0xff, 0x6f, 0xff, 0x0f,
+ 0xb6, 0xfd, 0x7f, 0xfb, 0xff, 0x0f, 0x55, 0xfb, 0xff, 0x7f, 0xff, 0x0f,
+ 0x07, 0x7e, 0x70, 0xa3, 0x1f, 0x0e, 0x05, 0x18, 0xe0, 0x25, 0x07, 0x08,
+ 0x71, 0x9c, 0x63, 0x9c, 0xe7, 0x08, 0xd1, 0x8c, 0xe7, 0x3d, 0xe3, 0x09,
+ 0x69, 0xcb, 0x7f, 0xfe, 0xf3, 0x0f, 0xd9, 0xce, 0xff, 0xec, 0xf3, 0x0f,
+ 0xa9, 0xcd, 0x7f, 0xbf, 0xf3, 0x0f, 0x71, 0x8d, 0x6f, 0x7a, 0xe3, 0x0f,
+ 0x01, 0x1c, 0xe0, 0x94, 0x47, 0x09, 0x07, 0x38, 0xe0, 0x23, 0x0f, 0x0c,
+ 0xad, 0xff, 0xfc, 0xfd, 0x7f, 0x0f, 0x6d, 0xfd, 0xbf, 0xdf, 0xff, 0x0f,
+ 0xb5, 0xfd, 0xff, 0x7d, 0xff, 0x0f, 0x6f, 0xfb, 0xff, 0xeb, 0xff, 0x0f,
+ 0xda, 0xfe, 0x7f, 0x7f, 0xff, 0x0f, 0xab, 0xfd, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0x83, 0x1f, 0xfc, 0xe4, 0x57, 0x0f, 0x01, 0x0e, 0xf0, 0x80, 0x07, 0x0c,
+ 0x03, 0x1c, 0xe0, 0x08, 0x47, 0x08, 0xe7, 0x1c, 0xe7, 0x3d, 0xef, 0x09,
+ 0xe3, 0x9c, 0xe7, 0x38, 0xc7, 0x09, 0x03, 0x1e, 0xe0, 0x81, 0x0f, 0x0c,
+ 0x03, 0x1f, 0xf8, 0xc1, 0x0f, 0x0e, 0xe3, 0x1f, 0xff, 0xfd, 0xef, 0x0f,
+ 0x83, 0x1f, 0xfc, 0xe0, 0x07, 0x0f, 0x83, 0x1f, 0xfc, 0xe0, 0x07, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0x0f, 0x3f, 0xf8, 0xe3, 0x1f, 0x0f, 0x03, 0x1e, 0xf0, 0x81, 0x07, 0x0c,
+ 0x73, 0x9e, 0xf3, 0x9c, 0xe7, 0x0c, 0x73, 0x9e, 0xf3, 0xbc, 0xe7, 0x0d,
+ 0xc3, 0x1f, 0xfc, 0xf8, 0x87, 0x0f, 0x07, 0x3e, 0xf0, 0x81, 0x0f, 0x0c,
+ 0x3f, 0xfe, 0xf1, 0x9f, 0x7f, 0x0c, 0x7b, 0x9c, 0xe3, 0xbe, 0xf7, 0x0d,
+ 0x21, 0x0e, 0xf0, 0x88, 0x43, 0x0c, 0x03, 0x1e, 0xf0, 0xc0, 0x07, 0x0c,
+ 0xdf, 0xff, 0xfc, 0xff, 0x7f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xb5, 0xfa, 0xff, 0xff, 0xff, 0x0f, 0x6e, 0xff, 0x7f, 0x55, 0xff, 0x0f,
+ 0xd5, 0xfa, 0xff, 0xff, 0xff, 0x0f, 0xbb, 0xfe, 0xbf, 0x7b, 0xff, 0x0f,
+ 0xd6, 0xfd, 0xff, 0xef, 0xff, 0x0f, 0xb5, 0xfa, 0x7f, 0x7d, 0xff, 0x0f,
+ 0x55, 0x8e, 0xf3, 0xd7, 0xf7, 0x0e, 0x41, 0x0c, 0x61, 0x18, 0xc3, 0x08,
+ 0x21, 0x1c, 0xf3, 0x9e, 0xc7, 0x0c, 0x27, 0x3a, 0xf0, 0x51, 0x0f, 0x0e,
+ 0x8a, 0x7b, 0xb8, 0xe3, 0x1f, 0x0f, 0x0b, 0x7e, 0x7c, 0xaf, 0x1f, 0x0f,
+ 0x06, 0x3b, 0xf8, 0xe1, 0x0e, 0x0e, 0x22, 0x1e, 0xf1, 0x9d, 0x4f, 0x0c,
+ 0x21, 0x08, 0xa1, 0xa8, 0xc2, 0x08, 0x21, 0x08, 0x61, 0x1a, 0x43, 0x08,
+ 0xdd, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x5b, 0xfd, 0xff, 0xeb, 0xff, 0x0f,
+ 0x6a, 0xfb, 0xbf, 0xbf, 0xff, 0x0f, 0xdd, 0xfe, 0x7f, 0x7d, 0xff, 0x0f,
+ 0xab, 0xfd, 0xff, 0xf7, 0xff, 0x0f, 0xba, 0xfa, 0xff, 0xbf, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x01, 0x0c, 0x60, 0x80, 0x03, 0x0c,
+ 0x01, 0x0e, 0x70, 0x80, 0x03, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f };
diff --git a/kscreensaver/kdesavers/vm.xpm b/kscreensaver/kdesavers/vm.xpm
new file mode 100644
index 00000000..8d00a5b3
--- /dev/null
+++ b/kscreensaver/kdesavers/vm.xpm
@@ -0,0 +1,493 @@
+/* XPM */
+static const char *vm[] = {
+/* columns rows colors chars-per-pixel */
+"44 374 113 2",
+" c #005e00",
+". c #003c63",
+"X c #003b00",
+"o c #00263e",
+"O c #00b3ed",
+"+ c #00c3ff",
+"@ c #007095",
+"# c #007ba0",
+"$ c #0086b9",
+"% c #0095cb",
+"& c #005474",
+"* c #005e80",
+"= c #006d00",
+"- c #008d00",
+"; c #004a74",
+": c #006997",
+"> c #004500",
+", c #005900",
+"< c #002f49",
+"1 c #00425f",
+"2 c #00ec00",
+"3 c #00dc00",
+"4 c #009400",
+"5 c #008a00",
+"6 c #009c00",
+"7 c #00cc00",
+"8 c #0077a8",
+"9 c #00a5dc",
+"0 c #006200",
+"q c #008000",
+"w c #004b6a",
+"e c #00688a",
+"r c #00bc00",
+"t c #007600",
+"y c #007d00",
+"u c #005985",
+"i c #004f00",
+"p c #003854",
+"a c #00ac00",
+"s c #006c00",
+"d c #5d5e00",
+"f c Gray0",
+"g c #3b3b00",
+"h c #6f7000",
+"j c #b7b700",
+"k c #c9c900",
+"l c #a5a600",
+"z c #939400",
+"x c Gray11",
+"c c #8d8d8d",
+"v c #aaaaaa",
+"b c #717171",
+"n c #555555",
+"m c #464600",
+"M c #737300",
+"N c #7e7e00",
+"B c #686800",
+"V c #5c5d00",
+"C c Gray7",
+"Z c Gray35",
+"A c Gray42",
+"S c Gray28",
+"D c Gray21",
+"F c Yellow",
+"G c Gray100",
+"H c #a0a000",
+"J c #a0a0a0",
+"K c #eded00",
+"L c #818200",
+"P c #e2e2e2",
+"I c Gray22",
+"U c #959500",
+"Y c #515200",
+"T c #8e8e8e",
+"R c #232323",
+"E c #dbdb00",
+"W c #c6c6c6",
+"Q c #8a8a00",
+"! c #7c7c7c",
+"~ c #2a2a2a",
+"^ c #6a6a6a",
+"/ c #808080",
+"( c Gray25",
+") c #1b1b1b",
+"_ c #434343",
+"` c #515151",
+"' c #282828",
+"] c #c0c0c0",
+"[ c #797979",
+"{ c #151515",
+"} c Gray5",
+"| c #959595",
+" . c Gray37",
+".. c #610000",
+"X. c #3d0000",
+"o. c #840000",
+"O. c #960000",
+"+. c #730000",
+"@. c #530000",
+"#. c #5e0000",
+"$. c #480000",
+"%. c #dc0000",
+"&. c Red",
+"*. c #ca0000",
+"=. c #8a0000",
+"-. c #a00000",
+";. c #7f0000",
+":. c #a70000",
+">. c #ed0000",
+",. c #690000",
+"<. c #950000",
+"1. c #b80000",
+"2. c #740000",
+/* pixels */
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" = - - . . . . ; : : . . . . X X X X > , , X X X X o o o o < 1 1 o o o o ",
+" - 2 2 2 3 = . . . : + + + O ; . . X X X , 4 4 4 5 > X X o o o 1 # # # @ < o o ",
+" = 2 3 - 6 2 7 . . ; + O : 8 + 9 . . X X > 4 5 , 0 4 q X X o o < # @ 1 w # e o o ",
+" 6 2 - r 2 = . . 8 + : . . % + ; . X X 0 4 , X X t 4 > X o o w # 1 o o * # < o ",
+" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ",
+" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ",
+" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ",
+" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ",
+" 6 2 - r 2 = . . 8 + : . . % + ; . X X 0 4 , X X t 4 > X o o w # 1 o o * # < o ",
+" = 2 3 - 6 2 7 . . ; + O : 8 + 9 . . X X > 4 5 , 0 4 q X X o o < # @ 1 w # e o o ",
+" - 2 2 2 3 = . . . : + + + O ; . . X X X , 4 4 4 5 > X X o o o 1 # # # @ < o o ",
+" = - - . . . . ; : : . . . . X X X X > , , X X X X o o o o < 1 1 o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" y . . . . . . u . . . . X X X X X X i X X X X o o o o o o p o o o o ",
+" = a r 2 2 . . ; $ % + + . . . . X X > s t 4 4 X X X X o o < & * # # o o o o ",
+" y 2 3 3 2 . . u + O O + . . . . X X i 4 5 5 4 X X X X o o p # @ @ # o o o o ",
+" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ",
+" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ",
+" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ",
+" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ",
+" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ",
+" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ",
+" = r r 3 2 r r - . . ; % % O + % % : . X X > t t 5 4 t t , X o o < * * @ # * * 1 o ",
+" y 2 2 2 2 2 2 a . . u + + + + + + $ . X X i 4 4 4 4 4 4 s X o o p # # # # # # & o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" y - y . . . . u : u . . . . X X X X i , i X X X X o o o o p 1 p o o o o ",
+" = 7 2 2 2 7 = . . ; 9 + + + 9 ; . . X X > q 4 4 4 q > X X o o < e # # # e < o o ",
+" 7 2 a - a 2 7 . . 9 + $ : $ + 9 . . X X q 4 s , s 4 q X X o o e # & 1 & # e o o ",
+" 3 a r 2 . . O $ . . . % + . . X X 5 s X X X t 4 X X o o @ & o o o * # o o ",
+" = 3 3 . . . . . . ; O O . . X X X X X X > 5 5 X X o o o o o o < @ @ o o ",
+" = 3 2 - . . . . . ; O + : . . X X X X X > 5 4 , X X o o o o o < @ # 1 o o ",
+" = 3 2 a . . . . ; O + $ . . . X X X X > 5 4 s X X X o o o o < @ # & o o o ",
+" - 3 2 - . . . : O + : . . . . X X X , 5 4 , X X X X o o o 1 @ # 1 o o o o ",
+" - 2 3 y - a . . : + O u . : $ . . X X , 4 5 i X , s X X o o 1 # @ p o 1 & o o ",
+" - 2 2 7 r r 3 2 . : + + 9 % % O + . . X , 4 4 q t t 5 4 X X o 1 # # e * * @ # o o ",
+" - 2 2 2 2 2 2 2 . : + + + + + + + . . X , 4 4 4 4 4 4 4 X X o 1 # # # # # # # o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" y - - . . . . u : : . . . . X X X X i , , X X X X o o o o p 1 1 o o o o ",
+" = 3 2 2 2 3 = . . ; O + + + O ; . . X X > 5 4 4 4 5 > X X o o < @ # # # @ < o o ",
+" r 2 6 - 6 2 7 . . % + 8 : 8 + 9 . . X X t 4 0 , 0 4 q X X o o * # w 1 w # e o o ",
+" = y r 2 . . ; u . . . % + . . X X > i X X X t 4 X X o o < p o o o * # o o ",
+" = - 6 2 7 . . . . ; : 8 + 9 . . X X X X > , 0 4 q X X o o o o < 1 w # e o o ",
+" r 2 2 2 = . . . . % + + + ; . . X X X X t 4 4 4 > X X o o o o * # # # < o o ",
+" = - a 2 r . . . . ; : $ + % . . X X X X > , s 4 t X X o o o o < 1 & # * o o ",
+" 6 2 y . . . . . . . 8 + u . X X X X X X X 0 4 i X o o o o o o o w # p o ",
+" 6 2 - . . . . . . . 8 + : . X X X X X X X 0 4 , X o o o o o o o w # 1 o ",
+" a 6 - - a 2 2 = . . $ 8 : : $ + + ; . X X s 0 , , s 4 4 > X o o & w 1 1 & # # < o ",
+" 7 2 2 2 2 3 - . . 9 + + + + O : . . X X q 4 4 4 4 5 , X X o o e # # # # @ 1 o o ",
+" y - - y . . . u : : u . . . . X X X i , , i X X X X o o o p 1 1 p o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" 7 2 r . . . . . 9 + % . . . X X X X X q 4 t X X X o o o o o e # * o o o ",
+" - 2 2 r . . . . : + + % . . . X X X X , 4 4 t X X X o o o o 1 # # * o o o ",
+" 3 3 2 r . . . . O O + % . . . X X X X 5 5 4 t X X X o o o o @ @ # * o o o ",
+" a 2 - 2 r . . . $ + : + % . . . X X X s 4 , 4 t X X X o o o & # 1 # * o o o ",
+" = 2 7 2 r . . ; + 9 . + % . . . X X > 4 q X 4 t X X X o o < # e o # * o o o ",
+" 7 2 y 2 r . . 9 + u . + % . . . X X q 4 i X 4 t X X X o o e # p o # * o o o ",
+" y 2 3 r r 2 3 - . u + O % % + O : . . X i 4 5 t t 4 5 , X X o p # @ * * # @ 1 o o ",
+" - 2 2 2 2 2 2 a . : + + + + + + $ . . X , 4 4 4 4 4 4 s X X o 1 # # # # # # & o o ",
+" - r 2 3 - . . . . : % + O : . . X X X X , t 4 5 , X X o o o o 1 * # @ 1 o o ",
+" a 2 2 2 a . . . . $ + + + $ . . X X X X s 4 4 4 s X X o o o o & # # # & o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" - 2 2 2 2 2 a . . : + + + + + $ . . X X , 4 4 4 4 4 s X X o o 1 # # # # # & o o ",
+" - 2 7 r r r - . . : + 9 % % % : . . X X , 4 q t t t , X X o o 1 # e * * * 1 o o ",
+" - 2 - . . : + : . . . . . . X X , 4 , X X X X X X o o 1 # 1 o o o o o o ",
+" - 2 7 2 2 a . . : + 9 + + $ . . . X X , 4 q 4 4 s X X X o o 1 # e # # & o o o ",
+" - 2 3 r 7 2 r . . : + O % 9 + % . . X X , 4 5 t q 4 t X X o o 1 # @ * e # * o o ",
+" - r 2 y . . . : . . . % + u . X X X , X X X t 4 i X o o o 1 o o o * # p o ",
+" - 2 - . . . . . . . : + : . X X X X X X X , 4 , X o o o o o o o 1 # 1 o ",
+" 6 2 - . . . . . . . 8 + : . X X X X X X X 0 4 , X o o o o o o o w # 1 o ",
+" y 2 a - - a 2 3 . u + $ : : $ + O . . X i 4 s , , s 4 5 X X o p # & 1 1 & # @ o o ",
+" = 7 2 2 2 2 3 = . ; 9 + + + + O ; . . X > q 4 4 4 4 5 > X X o < e # # # # @ < o o ",
+" = - - y . . . ; : : u . . . . X X X > , , i X X X X o o o < 1 1 p o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" = - - . . . . . ; : : . . . X X X X X > , , X X X o o o o o < 1 1 o o o ",
+" = 7 2 2 2 a . . . ; 9 + + + $ . . X X X > q 4 4 4 s X X o o o < e # # # & o o ",
+" = 3 2 r - a - . . ; O + % : $ : . . X X > 5 4 t , s , X X o o < @ # * 1 & 1 o o ",
+" a 2 - . . $ + : . . . . . . X X s 4 , X X X X X X o o & # 1 o o o o o o ",
+" 2 a 6 r 6 . . + $ 8 % 8 . . . . X X 4 s 0 t 0 X X X X o o # & w * w o o o o ",
+" - 2 3 2 2 2 3 . : + O + + + O . . . X , 4 5 4 4 4 5 X X X o 1 # @ # # # @ o o o ",
+" - 2 2 6 a 2 6 . : + + 8 . $ + 8 . . X , 4 4 0 X s 4 0 X X o 1 # # w o & # w o o ",
+" - 2 7 2 r . : + 9 . . . + % . . X , 4 q X X X 4 t X X o 1 # e o o o # * o o ",
+" 2 3 = 2 r . . + O . . ; + % . . X X 4 5 X X > 4 t X X o o # @ o o < # * o o ",
+" r 2 r - r 2 y . . % + % : % + u . . X X t 4 t , t 4 i X X o o * # * 1 * # p o o ",
+" = 7 2 2 2 r . . ; 9 + + + % . . . X X > q 4 4 4 t X X X o o < e # # # * o o o ",
+" y - = . . . . u : ; . . . . X X X X i , > X X X X o o o o p 1 < o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" - 2 2 2 2 2 2 - . . : + + + + + + : . X X , 4 4 4 4 4 4 , X o o 1 # # # # # # 1 o ",
+" - 2 7 r r 7 2 . . : + 9 % % 9 + . . X X , 4 q t t q 4 X X o o 1 # e * * e # o o ",
+" = r = r 3 . . ; % ; . . % O . . X X > t > X X t 5 X X o o < * < o o * @ o o ",
+" 2 r . . . . . . . + % . . X X X X X X X 4 t X X o o o o o o o # * o o ",
+" - 2 - . . . . . . : + : . . X X X X X X , 4 , X X o o o o o o 1 # 1 o o ",
+" a 2 . . . . . . $ + . . . X X X X X X s 4 X X X o o o o o o & # o o o ",
+" 3 7 . . . . . . O 9 . . . X X X X X X 5 q X X X o o o o o o @ e o o o ",
+" y 2 6 . . . . . u + 8 . . . X X X X X i 4 0 X X X o o o o o p # w o o o ",
+" a 2 = . . . . . $ + ; . . . X X X X X s 4 > X X X o o o o o & # < o o o ",
+" a 3 . . . . . $ O . . . . X X X X X s 5 X X X X o o o o o & @ o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" y - y . . . . u : u . . . . X X X X i , i X X X X o o o o p 1 p o o o o ",
+" = 7 2 2 2 7 = . . ; 9 + + + 9 ; . . X X > q 4 4 4 q > X X o o < e # # # e < o o ",
+" 7 2 a - a 2 7 . . 9 + $ : $ + 9 . . X X q 4 s , s 4 q X X o o e # & 1 & # e o o ",
+" 2 r r 2 . . + % . . . % + . . X X 4 t X X X t 4 X X o o # * o o o * # o o ",
+" 7 3 y y 3 7 . . 9 O u . u O 9 . . X X q 5 i X i 5 q X X o o e @ p o p @ e o o ",
+" = 7 2 2 2 7 = . . ; 9 + + + 9 ; . . X X > q 4 4 4 q > X X o o < e # # # e < o o ",
+" = 3 3 r 3 3 = . . ; O O % O O ; . . X X > 5 5 t 5 5 > X X o o < @ @ * @ @ < o o ",
+" 3 3 3 7 . . O O . . . O 9 . . X X 5 5 X X X 5 q X X o o @ @ o o o @ e o o ",
+" 2 r r 2 . . + % . . . % + . . X X 4 t X X X t 4 X X o o # * o o o * # o o ",
+" 7 2 a - a 2 7 . . 9 + $ : $ + 9 . . X X q 4 s , s 4 q X X o o e # & 1 & # e o o ",
+" = 3 2 2 2 3 = . . ; O + + + O ; . . X X > 5 4 4 4 5 > X X o o < @ # # # @ < o o ",
+" y - y . . . . u : u . . . . X X X X i , i X X X X o o o o p 1 p o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" = - - . . . ; : : . . . . . X X X > , , X X X X X o o o < 1 1 o o o o o ",
+" - 2 2 2 3 - . . : + + + O : . . . X X , 4 4 4 5 , X X X o o 1 # # # @ 1 o o o ",
+" 2 3 - 6 2 3 = . . + O : 8 + O ; . . X X 4 5 , 0 4 5 > X X o o # @ 1 w # @ < o o ",
+" - 2 - a 2 - . : + : . . $ + : . . X , 4 , X X s 4 , X X o 1 # 1 o o & # 1 o o ",
+" - 2 6 6 2 r . : + 8 . . 8 + % . . X , 4 0 X X 0 4 t X X o 1 # w o o w # * o o ",
+" 3 3 - a 2 2 r . . O O : $ + + % . . X X 5 5 , s 4 4 t X X o o @ @ 1 & # # * o o ",
+" - 2 2 2 r 2 r . . : + + + % + % . . X X , 4 4 4 t 4 t X X o o 1 # # # * # * o o ",
+" = - y 6 2 - . . . ; : u 8 + : . . X X X > , i 0 4 , X X o o o < 1 p w # 1 o o ",
+" = 3 3 . . . . . ; O O . . . X X X X X > 5 5 X X X o o o o o < @ @ o o o ",
+" = r - a 2 2 - . ; % : $ + + : . . . X > t , s 4 4 , X X X o < * 1 & # # 1 o o o ",
+" y 2 2 2 3 - . u + + + O : . . . . X i 4 4 4 5 , X X X X o p # # # @ 1 o o o o ",
+" = - y . . ; : u . . . . . . X X > , i X X X X X X o o < 1 p o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" = - - - - . . ; : : : : . . . . X X > , , , , X X X X o o < 1 1 1 1 o o o o ",
+" 6 2 2 2 2 - . . 8 + + + + : . . . X X 0 4 4 4 4 , X X X o o w # # # # 1 o o o ",
+" = - 7 2 2 7 . . ; : 9 + + 9 . . . X X > , q 4 4 q X X X o o < 1 e # # e o o o ",
+" 3 3 7 2 = . . . . O O 9 + ; . . X X X X 5 5 q 4 > X X o o o o @ @ e # < o o ",
+" - 2 6 y 2 a . . . : + 8 u + $ . . X X X , 4 0 i 4 s X X o o o 1 # w p # & o o ",
+" 7 2 3 2 . . . 9 + . . O + . . X X X q 4 X X 5 4 X X o o o e # o o @ # o o ",
+" y 2 2 2 2 2 2 6 . . u + + + + + + 8 . X X i 4 4 4 4 4 4 0 X o o p # # # # # # w o ",
+" a 2 r r r r 2 7 . . $ + % % % % + 9 . X X s 4 t t t t 4 q X o o & # * * * * # e o ",
+" a 2 2 r = a 3 2 r . $ + + % ; . $ O + % X s 4 4 t > X s 5 4 t o & # # * < o & @ # * ",
+" 3 2 2 2 y 3 2 2 2 . O + + + u . O + + + X 5 4 4 4 i X 5 4 4 4 o @ # # # p o @ # # # ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ",
+" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" y - - - - - . . u : : : : : . . . X X i , , , , , X X X o o p 1 1 1 1 1 o o o ",
+" 2 2 2 2 2 2 3 - . . + + + + + + O : . X X 4 4 4 4 4 4 5 , X o o # # # # # # @ 1 o ",
+" y 2 7 - - 6 2 3 . . u + 9 : : 8 + O . X X i 4 q , , 0 4 5 X o o p # e 1 1 w # @ o ",
+" 2 r r 2 . . . + % . . . % + . X X X 4 t X X X t 4 X o o o # * o o o * # o ",
+" 2 7 - - a 2 a . . . + 9 : : $ + $ . X X X 4 q , , s 4 s X o o o # e 1 1 & # & o ",
+" 2 2 2 2 2 2 a . . . + + + + + + $ . X X X 4 4 4 4 4 4 s X o o o # # # # # # & o ",
+" 2 7 - - - 7 2 6 . . . + 9 : : : 9 + 8 X X X 4 q , , , q 4 0 o o o # e 1 1 1 e # w ",
+" 2 r 2 r . . . + % . . . . + % X X X 4 t X X X X 4 t o o o # * o o o o # * ",
+" a 2 3 r r r 7 2 6 . . $ + O % % % 9 + 8 X X s 4 5 t t t q 4 0 o o & # @ * * * e # w ",
+" 3 2 2 2 2 2 3 a . . O + + + + + O $ . X X 5 4 4 4 4 4 5 s X o o @ # # # # # @ & o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d h j k k l z h d f f f x c v v b n x f g g g m M N N B V m g f f f C Z A A S D C f ",
+"d d z F F F F F F k d f f n G G G G G G v f g g V H H H H H H N g f f D J J J J J J A f ",
+"d h F K L d h j F k d f x G P I f x c G v f g m H U Y g m M H N g f C J T R f C Z J A f ",
+"d l F l d d d d E j d f b G b f f f f W c f g B H B g g g g Q M g f S J S f f f f ! Z f ",
+"d k F d d d d d d d d f v G f f f f f f f f g N H g g g g g g g g f A J f f f f f f f f ",
+"d k F d d d d d d d d f v G f f f f f f f f g N H g g g g g g g g f A J f f f f f f f f ",
+"d k F d d d d d d d d f v G f f f f f f f f g N H g g g g g g g g f A J f f f f f f f f ",
+"d l F l d d d d h L d f b G b f f f f x I f g B H B g g g g m Y g f S J S f f f f C R f ",
+"d d K F E z z l K F d f f P G W n n b P G f g g U H Q V V B U H g f f T J ! D D S T J f ",
+"d d h k F F F F K z d f f x v G G G G P n f g g m N H H H H U V g f f C A J J J J T D f ",
+"d d d d h z z L d d d f f f f x n n I f f f g g g g m V V Y g g g f f f f C D D R f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f n n n n n x f f f f f n n n n n x f f f f f D D D D D C f f f f f D D D D D C f f f ",
+"f n G G G G G G v f f f n G G G G G G v f f f D J J J J J J A f f f D J J J J J J A f f ",
+"f f c G c n n W G b f f f c G c n n W G b f f f Z J Z D D ! J S f f f Z J Z D D ! J S f ",
+"f f n G n f f f G v f f f n G n f f f G v f f f D J D f f f J A f f f D J D f f f J A f ",
+"f f n G n f f x G v f f f n G n f f x G v f f f D J D f f C J A f f f D J D f f C J A f ",
+"f f n G W v v G G I f f f n G W v v G G I f f f D J ! A A J J R f f f D J ! A A J J R f ",
+"f f n G G G G W I f f f f n G G G G W I f f f f D J J J J ! R f f f f D J J J J ! R f f ",
+"f f n G n f f f f f f f f n G n f f f f f f f f D J D f f f f f f f f D J D f f f f f f ",
+"f x W G W v c f f f f f x W G W v c f f f f f C ! J ! A Z f f f f f C ! J ! A Z f f f f ",
+"f I G G G G P f f f f f I G G G G P f f f f f R J J J J T f f f f f R J J J J T f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f ~ ^ / / ( ~ f f f f f I c v v n I f f f f f ) _ ` ` ' ) f f f f f R Z A A D R f f ",
+"f f ( ] ] ] ] ] ] f f f f n G G G G G G f f f f ' [ [ [ [ [ [ f f f f D J J J J J J f f ",
+"f f v v ~ f { v ] f f f f P P I f x P G f f f f A A ) f } A [ f f f f T T R f C T J f f ",
+"f f ] | f f f ( ^ f f f f G W f f f n c f f f f [ .f f f ' _ f f f f J ! f f f D Z f f ",
+"f f | ] | ^ ( f f f f f f W G W c n f f f f f f .[ ._ ' f f f f f f ! J ! Z D f f f f ",
+"f f f ^ v ] ] ] ^ f f f f f c P G G G c f f f f f _ A [ [ [ _ f f f f f Z T J J J Z f f ",
+"f f f f f ~ n v ] ~ f f f f f f I b P G I f f f f f f ) D A [ ) f f f f f f R S T J R f ",
+"f ~ ] ~ f f f ( ] ( f f I G I f f f n G n f f ) [ ) f f f ' [ ' f f R J R f f f D J D f ",
+"f ( ] v n ( n v ] { f f n G P b n b P G x f f ' [ A D ' D A [ } f f D J T S D S T J C f ",
+"f ~ ] v ] ] ] ] ( f f f I G P G G G G n f f f ) [ A [ [ [ [ ' f f f R J T J J J J D f f ",
+"f f f f ~ ( ( f f f f f f f f I n n f f f f f f f f ) ' ' f f f f f f f f R D D f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"..o.O.O.+...+.O.O.o...f I n n x f x n n I f X.@.#.#.$.X.$.#.#.@.X.f R D D C f C D D R f ",
+"..%.&.&.*...O.&.&.&...f W G G v f n G G G f X.=.-.-.;.X.#.-.-.-.X.f ! J J A f D J J J f ",
+"..o.%.&.:...+.&.>.o...f I W G b f x G P I f X.@.=.-.,.X.$.-.<.@.X.f R ! J S f C J T R f ",
+"....+.>.&.:.>.&.o.....f f x P G b P G I f f X.X.$.<.-.,.<.-.@.X.X.f f C T J S T J R f f ",
+"......+.>.&.&.O.......f f f x P G G n f f f X.X.X.$.<.-.-.#.X.X.X.f f f C T J J D f f f ",
+"........*.&.>.+.......f f f f v G P x f f f X.X.X.X.;.-.<.$.X.X.X.f f f f A J T C f f f ",
+"......*.&.%.&.%.......f f f v G W G W f f f X.X.X.;.-.=.-.=.X.X.X.f f f A J ! J ! f f f ",
+"....O.&.*...:.&.*.....f f n G v f b G v f f X.X.#.-.;.X.,.-.;.X.X.f f D J A f S J A f f ",
+"..1.&.&.*...O.&.&.%.+.f c G G v f n G G W x X.2.-.-.;.X.#.-.-.=.$.f Z J J A f D J J ! C ",
+"..>.&.&.>...1.&.&.&.o.f P G G P f c G G G I X.<.-.-.<.X.2.-.-.-.@.f T J J T f Z J J J R ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f P G G G G G G G I f f P G G G G G G G I f f T J J J J J J J R f f T J J J J J J J R f ",
+"f c v v v v v v v x f f c v v v v v v v x f f Z A A A A A A A C f f Z A A A A A A A C f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ",
+"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f "
+};
diff --git a/kscreensaver/kdesavers/vm_random.c b/kscreensaver/kdesavers/vm_random.c
new file mode 100644
index 00000000..ea0cd96a
--- /dev/null
+++ b/kscreensaver/kdesavers/vm_random.c
@@ -0,0 +1,379 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/*
+ * Please note that as of July 22, 1999, the licensees and distributors
+ * are no longer required to include the above mentioned acknowledgement
+ * within advertising materials. For full details see
+ * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+ */
+
+/*
+ * This is derived from the Berkeley source:
+ * @(#)random.c 5.5 (Berkeley) 7/6/88
+ * It was reworked for the GNU C Library by Roland McGrath.
+ * Rewritten to be reentrant by Ulrich Drepper, 1995
+ */
+
+#include <limits.h>
+#include <stdlib.h>
+#include "vm_random.h"
+
+/* An improved random number generation package. In addition to the standard
+ rand()/srand() like interface, this package also has a special state info
+ interface. The initstate() routine is called with a seed, an array of
+ bytes, and a count of how many bytes are being passed in; this array is
+ then initialized to contain information for random number generation with
+ that much state information. Good sizes for the amount of state
+ information are 32, 64, 128, and 256 bytes. The state can be switched by
+ calling the setstate() function with the same array as was initialized
+ with initstate(). By default, the package runs with 128 bytes of state
+ information and generates far better random numbers than a linear
+ congruential generator. If the amount of state information is less than
+ 32 bytes, a simple linear congruential R.N.G. is used. Internally, the
+ state information is treated as an array of longs; the zeroth element of
+ the array is the type of R.N.G. being used (small integer); the remainder
+ of the array is the state information for the R.N.G. Thus, 32 bytes of
+ state information will give 7 longs worth of state information, which will
+ allow a degree seven polynomial. (Note: The zeroth word of state
+ information also has some other information stored in it; see setstate
+ for details). The random number generation technique is a linear feedback
+ shift register approach, employing trinomials (since there are fewer terms
+ to sum up that way). In this approach, the least significant bit of all
+ the numbers in the state table will act as a linear feedback shift register,
+ and will have period 2^deg - 1 (where deg is the degree of the polynomial
+ being used, assuming that the polynomial is irreducible and primitive).
+ The higher order bits will have longer periods, since their values are
+ also influenced by pseudo-random carries out of the lower bits. The
+ total period of the generator is approximately deg*(2**deg - 1); thus
+ doubling the amount of state information has a vast influence on the
+ period of the generator. Note: The deg*(2**deg - 1) is an approximation
+ only good for large deg, when the period of the shift register is the
+ dominant factor. With deg equal to seven, the period is actually much
+ longer than the 7*(2**7 - 1) predicted by this formula. */
+
+
+
+/* For each of the currently supported random number generators, we have a
+ break value on the amount of state information (you need at least this many
+ bytes of state info to support this random number generator), a degree for
+ the polynomial (actually a trinomial) that the R.N.G. is based on, and
+ separation between the two lower order coefficients of the trinomial. */
+
+/* Linear congruential. */
+#define TYPE_0 0
+#define BREAK_0 8
+#define DEG_0 0
+#define SEP_0 0
+
+/* x**7 + x**3 + 1. */
+#define TYPE_1 1
+#define BREAK_1 32
+#define DEG_1 7
+#define SEP_1 3
+
+/* x**15 + x + 1. */
+#define TYPE_2 2
+#define BREAK_2 64
+#define DEG_2 15
+#define SEP_2 1
+
+/* x**31 + x**3 + 1. */
+#define TYPE_3 3
+#define BREAK_3 128
+#define DEG_3 31
+#define SEP_3 3
+
+/* x**63 + x + 1. */
+#define TYPE_4 4
+#define BREAK_4 256
+#define DEG_4 63
+#define SEP_4 1
+
+
+/* Array versions of the above information to make code run faster.
+ Relies on fact that TYPE_i == i. */
+
+#define MAX_TYPES 5 /* Max number of types above. */
+
+struct vm_random_poly_info
+{
+ int seps[MAX_TYPES];
+ int degrees[MAX_TYPES];
+};
+
+static struct vm_random_poly_info vm_random_poly_info =
+{
+ { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 },
+ { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }
+};
+
+static int32_t vm_randtbl[DEG_3 + 1] =
+ {
+ TYPE_3,
+
+ -1726662223, 379960547, 1735697613, 1040273694, 1313901226,
+ 1627687941, -179304937, -2073333483, 1780058412, -1989503057,
+ -615974602, 344556628, 939512070, -1249116260, 1507946756,
+ -812545463, 154635395, 1388815473, -1926676823, 525320961,
+ -1009028674, 968117788, -123449607, 1284210865, 435012392,
+ -2017506339, -911064859, -370259173, 1132637927, 1398500161,
+ -205601318,
+ };
+
+/* Initialize the random number generator based on the given seed. If the
+ type is the trivial no-state-information type, just remember the seed.
+ Otherwise, initializes state[] based on the given "seed" via a linear
+ congruential generator. Then, the pointers are set to known locations
+ that are exactly rand_sep places apart. Lastly, it cycles the state
+ information a given number of times to get rid of any initial dependencies
+ introduced by the L.C.R.N.G. Note that the initialization of randtbl[]
+ for default usage relies on values produced by this routine. */
+int vm_srandom (unsigned int seed,
+ struct vm_random_data* buf)
+{
+ int type;
+ int32_t *state;
+ long int i;
+ long int word;
+ int32_t *dst;
+ int kc;
+
+ if (buf == NULL)
+ goto fail;
+ type = buf->vm_rand_type;
+ if ((unsigned int) type >= MAX_TYPES)
+ goto fail;
+
+ state = buf->state;
+ /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */
+ if (seed == 0)
+ seed = 1;
+ state[0] = seed;
+ if (type == TYPE_0)
+ goto done;
+
+ dst = state;
+ word = seed;
+ kc = buf->vm_rand_deg;
+ for (i = 1; i < kc; ++i)
+ {
+ /* This does:
+ state[i] = (16807 * state[i - 1]) % 2147483647;
+ but avoids overflowing 31 bits. */
+ long int hi = word / 127773;
+ long int lo = word % 127773;
+ word = 16807 * lo - 2836 * hi;
+ if (word < 0)
+ word += 2147483647;
+ *++dst = word;
+ }
+
+ buf->fptr = &state[buf->vm_rand_sep];
+ buf->rptr = &state[0];
+ kc *= 10;
+ while (--kc >= 0)
+ {
+ vm_random (buf);
+ }
+
+ done:
+ return 0;
+
+ fail:
+ return -1;
+}
+
+/* Initialize the state information in the given array of N bytes for
+ future random number generation. Based on the number of bytes we
+ are given, and the break values for the different R.N.G.'s, we choose
+ the best (largest) one we can and set things up for it. srandom is
+ then called to initialize the state information. Note that on return
+ from srandom, we set state[-1] to be the type multiplexed with the current
+ value of the rear pointer; this is so successive calls to initstate won't
+ lose this information and will be able to restart with setstate.
+ Note: The first thing we do is save the current state, if any, just like
+ setstate so that it doesn't matter when initstate is called.
+ Returns a pointer to the old state. */
+int vm_initstate (unsigned int seed,
+ void* arg_state,
+ size_t n,
+ struct vm_random_data* buf)
+{
+ int type;
+ int degree;
+ int separation;
+ int32_t *state;
+
+ if (buf == NULL)
+ goto fail;
+
+ if (n >= BREAK_3)
+ type = n < BREAK_4 ? TYPE_3 : TYPE_4;
+ else if (n < BREAK_1)
+ {
+ if (n < BREAK_0)
+ {
+ goto fail;
+ }
+ type = TYPE_0;
+ }
+ else
+ type = n < BREAK_2 ? TYPE_1 : TYPE_2;
+
+ degree = vm_random_poly_info.degrees[type];
+ separation = vm_random_poly_info.seps[type];
+
+ buf->vm_rand_type = type;
+ buf->vm_rand_sep = separation;
+ buf->vm_rand_deg = degree;
+ state = &((int32_t *) arg_state)[1]; /* First location. */
+ /* Must set END_PTR before srandom. */
+ buf->end_ptr = &state[degree];
+
+ buf->state = state;
+
+ vm_srandom (seed, buf);
+
+ state[-1] = TYPE_0;
+ if (type != TYPE_0)
+ state[-1] = (buf->rptr - state) * MAX_TYPES + type;
+
+ return 0;
+
+ fail:
+ return -1;
+}
+
+/* Restore the state from the given state array.
+ Note: It is important that we also remember the locations of the pointers
+ in the current state information, and restore the locations of the pointers
+ from the old state information. This is done by multiplexing the pointer
+ location into the zeroth word of the state information. Note that due
+ to the order in which things are done, it is OK to call setstate with the
+ same state as the current state
+ Returns a pointer to the old state information. */
+int vm_setstate (void* arg_state,
+ struct vm_random_data* buf)
+{
+ int32_t *new_state = (int32_t *) arg_state;
+ int type;
+ int old_type;
+ int32_t *old_state;
+ int degree;
+ int separation;
+
+ if (buf == NULL)
+ goto fail;
+
+ old_type = buf->vm_rand_type;
+ old_state = buf->state;
+ if (old_type == TYPE_0)
+ old_state[-1] = TYPE_0;
+ else
+ old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
+
+ type = new_state[0] % MAX_TYPES;
+ if (type < TYPE_0 || type >= TYPE_4)
+ goto fail;
+
+ buf->vm_rand_deg = degree = vm_random_poly_info.degrees[type];
+ buf->vm_rand_sep = separation = vm_random_poly_info.seps[type];
+ buf->vm_rand_type = type;
+
+ if (type != TYPE_0)
+ {
+ int rear = new_state[0] / MAX_TYPES;
+ buf->rptr = &new_state[rear];
+ buf->fptr = &new_state[(rear + separation) % degree];
+ }
+ buf->state = &new_state[1];
+ /* Set end_ptr too. */
+ buf->end_ptr = &new_state[degree];
+
+ return 0;
+
+ fail:
+ return -1;
+}
+
+/* If we are using the trivial TYPE_0 R.N.G., just do the old linear
+ congruential bit. Otherwise, we do our fancy trinomial stuff, which is the
+ same in all the other cases due to all the global variables that have been
+ set up. The basic operation is to add the number at the rear pointer into
+ the one at the front pointer. Then both pointers are advanced to the next
+ location cyclically in the table. The value returned is the sum generated,
+ reduced to 31 bits by throwing away the "least random" low bit.
+ Note: The code takes advantage of the fact that both the front and
+ rear pointers can't wrap on the same call by not testing the rear
+ pointer if the front one has wrapped. Returns a 31-bit random number. */
+
+int32_t vm_random (struct vm_random_data* buf)
+{
+ int32_t *state;
+ int32_t result;
+
+ if (buf == NULL)
+ goto fail;
+
+ state = buf->state;
+
+ if (buf->vm_rand_type == TYPE_0)
+ {
+ int32_t val = state[0];
+ val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
+ state[0] = val;
+ result = val;
+ }
+ else
+ {
+ int32_t *fptr = buf->fptr;
+ int32_t *rptr = buf->rptr;
+ int32_t *end_ptr = buf->end_ptr;
+ int32_t val;
+
+ val = *fptr += *rptr;
+ /* Chucking least random bit. */
+ result = (val >> 1) & 0x7fffffff;
+ ++fptr;
+ if (fptr >= end_ptr)
+ {
+ fptr = state;
+ ++rptr;
+ }
+ else
+ {
+ ++rptr;
+ if (rptr >= end_ptr)
+ rptr = state;
+ }
+ buf->fptr = fptr;
+ buf->rptr = rptr;
+ }
+ return result;
+
+ fail:
+ return -1;
+}
+
+void vm_default_initstate( int seed,
+ struct vm_random_data* buf ) {
+ vm_initstate( seed,
+ vm_randtbl,
+ 128,
+ buf );
+}
diff --git a/kscreensaver/kdesavers/vm_random.h b/kscreensaver/kdesavers/vm_random.h
new file mode 100644
index 00000000..1aa5e937
--- /dev/null
+++ b/kscreensaver/kdesavers/vm_random.h
@@ -0,0 +1,31 @@
+#ifndef __VM_RANDOM_H__
+#define __VM_RANDOM_H__
+
+#define VM_RAND_MAX 2147483647
+
+#define int32_t int
+
+struct vm_random_data
+{
+ int32_t *fptr; /* Front pointer. */
+ int32_t *rptr; /* Rear pointer. */
+ int32_t *state; /* Array of state values. */
+ int vm_rand_type; /* Type of random number generator. */
+ int vm_rand_deg; /* Degree of random number generator. */
+ int vm_rand_sep; /* Distance between front and rear. */
+ int32_t *end_ptr; /* Pointer behind state table. */
+};
+
+int vm_initstate (unsigned int seed,
+ void* arg_state,
+ size_t n,
+ struct vm_random_data* buf);
+int vm_setstate (void* arg_state,
+ struct vm_random_data* buf);
+void vm_default_initstate( int seed,
+ struct vm_random_data* buf );
+int vm_srandom (unsigned int seed,
+ struct vm_random_data* buf);
+int32_t vm_random (struct vm_random_data* buf);
+
+#endif /* !defined( __VM_RANDOM_H__ ) */
diff --git a/kscreensaver/kdesavers/wave.cpp b/kscreensaver/kdesavers/wave.cpp
new file mode 100644
index 00000000..e8a999a5
--- /dev/null
+++ b/kscreensaver/kdesavers/wave.cpp
@@ -0,0 +1,324 @@
+//-----------------------------------------------------------------------------
+//
+// kwave - Waveing Flag Screen Saver for KDE 2
+//
+// Copyright (c) Ian Reinhart Geiser 2001
+//
+#include <stdlib.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kcolordialog.h>
+#include <kbuttonbox.h>
+#include <kcolorbutton.h>
+#include <kglobal.h>
+#include "wave.h"
+#include "wave.moc"
+#ifdef Q_WS_MACX
+#include <OpenGL/glu.h>
+#include <OpenGL/gl.h>
+#else
+#include <GL/glu.h>
+#include <GL/gl.h>
+#endif
+#include <qimage.h>
+#include <kdebug.h>
+#include <qpainter.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <kstandarddirs.h>
+#include <math.h>
+#include <kmessagebox.h>
+#ifndef GLU_NURBS_TEXTURE_COORD
+#define GLU_NURBS_TEXTURE_COORD 100168
+#endif
+// libkscreensaver interface
+
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "kwave.kss";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Bitmap Wave Screen Saver" );
+ KDE_EXPORT const char *kss_version = "2.2.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KWaveSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KWaveSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// dialog to setup screen saver parameters
+//
+KWaveSetup::KWaveSetup( QWidget *parent, const char *name )
+ : SetupUi( parent, name, TRUE )
+{
+ readSettings();
+
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new KWaveSaver( preview->winId() );
+
+ connect( PushButton1, SIGNAL( clicked() ), SLOT( slotOkPressed() ) );
+ connect( PushButton2, SIGNAL( clicked() ), SLOT( reject() ) );
+ connect( PushButton3, SIGNAL( clicked() ), SLOT( aboutPressed() ) );
+ connect( SpinBox1, SIGNAL( valueChanged(int)), saver, SLOT( updateSize(int)));
+ connect( RadioButton1, SIGNAL( toggled(bool)), saver, SLOT( doStars(bool)));
+
+}
+
+KWaveSetup::~KWaveSetup( )
+{
+ delete saver;
+}
+
+
+// read settings from config file
+void KWaveSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+// color = config->readColorEntry( "Color", &black );
+}
+
+// Ok pressed - save settings and exit
+void KWaveSetup::slotOkPressed()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+// config->writeEntry( "Color", color );
+
+ config->sync();
+
+ accept();
+}
+
+void KWaveSetup::aboutPressed()
+{
+ KMessageBox::about(this,
+ i18n("<h3>Bitmap Flag Screen Saver</h3>\n<p>Waving Flag Screen Saver for KDE</p>\nCopyright (c) Ian Reinhart Geiser 2001"));
+}
+//-----------------------------------------------------------------------------
+
+
+KWaveSaver::KWaveSaver( WId id ) : KScreenSaver( id )
+{
+ kdDebug() << "Blank" << endl;
+ readSettings();
+
+ timer = new QTimer( this );
+ timer->start( 50, TRUE );
+ setBackgroundColor( black );
+ erase();
+ wave = new Wave();
+ embed(wave);
+ wave->show();
+ connect( timer, SIGNAL(timeout()), this, SLOT(blank()) );;
+}
+
+KWaveSaver::~KWaveSaver()
+{
+
+}
+
+// read configuration settings from config file
+void KWaveSaver::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+// color = config->readColorEntry( "Color", &black );
+}
+
+void KWaveSaver::blank()
+{
+ // Play wave
+
+ wave->updateGL();
+ timer->start( 100, TRUE );
+
+}
+Wave::Wave( QWidget * parent, const char * name) : QGLWidget (parent,name)
+{
+ pNurb = 0;
+
+ nNumPoints = 4;
+ index = 0;
+}
+
+Wave::~Wave()
+{
+ glDeleteTextures( 1, &texture[0] );
+ gluDeleteNurbsRenderer(pNurb);
+}
+
+/** setup the GL enviroment */
+void Wave::initializeGL ()
+{
+
+ kdDebug() << "InitGL" << endl;
+
+ /* Load in the texture */
+ if ( !LoadGLTextures( ) )
+ exit(0);
+
+ /* Enable Texture Mapping ( NEW ) */
+ glEnable( GL_TEXTURE_2D );
+
+ /* Enable smooth shading */
+ glShadeModel( GL_SMOOTH );
+ // Light values and coordinates
+ GLfloat specular[] = { 0.7f, 0.0f, 0.0f, 1.0f};
+ GLfloat shine[] = { 75.0f };
+
+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f );
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glEnable(GL_COLOR_MATERIAL);
+
+ glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
+ glMaterialfv(GL_FRONT, GL_SHININESS, shine);
+
+ glEnable(GL_AUTO_NORMAL);
+
+
+ pNurb = gluNewNurbsRenderer();
+
+ gluNurbsProperty(pNurb, GLU_SAMPLING_TOLERANCE, 25.0f);
+ // Uncomment the next line and comment the one following to produce a
+ // wire frame mesh.
+ //gluNurbsProperty(pNurb, GLU_DISPLAY_MODE, GLU_OUTLINE_POLYGON);
+ gluNurbsProperty(pNurb, GLU_DISPLAY_MODE, (GLfloat)GLU_FILL);
+ glEnable(GL_MAP2_TEXTURE_COORD_3);
+ glEnable(GL_MAP2_VERTEX_3);
+ glEnable(GL_BLEND);
+
+}
+/** resize the gl view */
+void Wave::resizeGL ( int w, int h)
+{
+ kdDebug() << "ResizeGL " << w << "," <<h<< endl;
+ // Prevent a divide by zero
+ if(h == 0)
+ h = 1;
+
+ // Set Viewport to window dimensions
+ glViewport(0, 0, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ // Perspective view
+ gluPerspective (45.0f, (GLdouble)w/(GLdouble)h, 1.0, 40.0f);
+
+ // Modelview matrix reset
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ // Viewing transformation, position for better view
+ glTranslatef (0.0f, 0.0f, -20.0f);
+
+}
+/** paint the GL view */
+void Wave::paintGL ()
+{
+
+ float ctrlPoints[4][4][3];
+
+ index++;
+ float Z[16];
+ for( int i = 0; i < 16; i++)
+ {
+ Z[i] = 3.0 * sin(16*(3.141592654 * 2.0f) * (index+(i))/360);
+ }
+
+// kdDebug() << "-----" << endl;
+ int counter =15;
+ for( int i = 0; i < 4; i++)
+ for( int j = 0; j < 4;j++)
+ {
+ ctrlPoints[i][j][0] = float((5*i)-10);
+ ctrlPoints[i][j][1] = float((3*j)-6);
+ ctrlPoints[i][j][2] = Z[counter--];
+// kdDebug() << Z[counter] << endl;
+ }
+ // Knot sequence for the NURB
+ float knots[8] = { 0, 0, 0, 0, 1, 1, 1, 1 };
+ // Draw in Blu
+ //glColor3ub(0,0,220);
+
+ // Clear the window with current clearing color
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ // Save the modelview matrix stack
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+
+ // Rotate the mesh around to make it easier to see
+ glRotatef(index/2, 1.0f,0.0f,0.0f);
+ glRotatef(index/5, 0.0f,1.0f,0.0f);
+ glRotatef(index/6, 0.0f,0.0f,1.0f);
+
+ // Render the NURB
+ gluBeginSurface( pNurb );
+ gluNurbsSurface( pNurb, 8, knots, 8, knots,
+ 4*3, 3, &ctrlPoints[0][0][0], 4, 4, GL_MAP2_TEXTURE_COORD_3);
+ //gluNurbsSurface( pNurb, 8, knots, 8, knots,
+ //4*3, 3, &ctrlPoints[0][0][0], 4, 4, GL_MAP2_NORMAL );
+ gluNurbsSurface( pNurb, 8, knots, 8, knots,
+ 4*3, 3, &ctrlPoints[0][0][0], 4, 4, GL_MAP2_VERTEX_3 );
+ gluEndSurface( pNurb );
+
+ // Restore the modelview matrix
+ glPopMatrix();
+
+ glFlush();
+}
+
+bool Wave::LoadGLTextures()
+{
+ /* Status indicator */
+ bool Status = TRUE;
+
+ QImage buf; // = QPixmap::grabWindow ( 0 ).convertToImage();
+ kdDebug() << "Loading: " << locate("data", "kscreensaver/image.png") << endl;
+ if (buf.load( locate("data", "kscreensaver/image.png") ) )
+
+ {
+ tex = convertToGLFormat(buf); // flipped 32bit RGBA
+ kdDebug() << "Texture loaded: " << tex.numBytes () << endl;
+ }
+ else
+ {
+ QImage dummy( 64, 64, 64 );
+ dummy.fill( Qt::white.rgb() );
+ buf = dummy;
+ tex = convertToGLFormat( buf );
+ }
+ /* Set the status to true */
+ //Status = TRUE;
+ glGenTextures(1, &texture[0]); /* create three textures */
+ glBindTexture(GL_TEXTURE_2D, texture[0]);
+ /* use linear filtering */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ /* actually generate the texture */
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
+ kdDebug() << "Texture Loaded: " << tex.width() << "," << tex.height() << endl;
+
+
+ return Status;
+}
diff --git a/kscreensaver/kdesavers/wave.h b/kscreensaver/kdesavers/wave.h
new file mode 100644
index 00000000..ea2f64f3
--- /dev/null
+++ b/kscreensaver/kdesavers/wave.h
@@ -0,0 +1,97 @@
+//-----------------------------------------------------------------------------
+//
+// kwave - Partical Wave Screen Saver for KDE 2
+//
+// Copyright (c) Ian Reinhart Geiser 2001
+//
+/////
+//NOTE:
+// The base particle engine did not come from me, it was designed by Jeff Molofee <nehe@connect.ab.ca>
+// I did some extensive modifications to make it work with QT's OpenGL but the base principal is about
+// the same.
+////
+
+#ifndef __WAVE_H__
+#define __WAVE_H__
+
+#include <qdialog.h>
+#include <qgl.h>
+#ifdef Q_WS_MACX
+#include <OpenGL/glu.h>
+#include <OpenGL/gl.h>
+#else
+#include <GL/glu.h>
+#include <GL/gl.h>
+#endif
+#include <kscreensaver.h>
+#include <qtimer.h>
+#include <qimage.h>
+#include "wavecfg.h"
+
+
+class Wave : public QGLWidget
+{
+Q_OBJECT
+
+public:
+ Wave( QWidget * parent=0, const char * name=0 );
+ ~Wave();
+
+protected:
+ /** paint the GL view */
+ void paintGL ();
+ /** resize the gl view */
+ void resizeGL ( int w, int h );
+ /** setup the GL enviroment */
+ void initializeGL ();
+
+
+private:
+//
+ GLUnurbsObj *pNurb;
+ GLint nNumPoints;
+// float ctrlPoints[4][4][3];
+// float knots[8];
+ int index;
+ bool LoadGLTextures();
+ GLuint texture[1];
+ QImage tex;
+
+};
+
+class KWaveSaver : public KScreenSaver
+{
+Q_OBJECT
+public:
+ KWaveSaver( WId drawable );
+ virtual ~KWaveSaver();
+ void readSettings();
+public slots:
+ void blank();
+
+private:
+ Wave *wave;
+ QTimer *timer;
+};
+
+class KWaveSetup : public SetupUi
+{
+ Q_OBJECT
+public:
+ KWaveSetup( QWidget *parent = NULL, const char *name = NULL );
+ ~KWaveSetup( );
+protected:
+ void readSettings();
+
+private slots:
+ void slotOkPressed();
+ void aboutPressed();
+private:
+ KWaveSaver *saver;
+ float size;
+ float stars;
+};
+
+#endif
+
+
diff --git a/kscreensaver/kdesavers/wavecfg.ui b/kscreensaver/kdesavers/wavecfg.ui
new file mode 100644
index 00000000..7fcab67a
--- /dev/null
+++ b/kscreensaver/kdesavers/wavecfg.ui
@@ -0,0 +1,191 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SetupUi</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SetupUi</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>209</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>209</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>400</width>
+ <height>250</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Bitmap Flag Setup</string>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>1</x>
+ <y>1</y>
+ <width>398</width>
+ <height>206</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Use textures</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>PushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;About</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="0">
+ <property name="name">
+ <cstring>SpinBox1</cstring>
+ </property>
+ <property name="maxValue">
+ <number>500</number>
+ </property>
+ <property name="minValue">
+ <number>10</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="4" column="0">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Shapes</string>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>130</width>
+ <height>50</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Stars</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Flares</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ <widget class="QWidget" row="0" column="1" rowspan="4" colspan="2">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Particle size:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>RadioButton1_2</sender>
+ <signal>pressed()</signal>
+ <receiver>RadioButton1</receiver>
+ <slot>toggle()</slot>
+ </connection>
+ <connection>
+ <sender>RadioButton1</sender>
+ <signal>pressed()</signal>
+ <receiver>RadioButton1_2</receiver>
+ <slot>toggle()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>