#!BPY """ Registration info for Blender menus: Name: 'jME XML V2 (.xml)' Blender: 241 Group: 'Export' Tip: 'Export to the new (V2) jME XML file format.' """ __author__ = ["Kai Rabien"] __version__ = "03/2006" __email__ = ('Author, hevee@gmx.de') __url__ = ('http://www.jmonkeyengine.com') __bpydoc__ = """\ This script exports Blender Objects to the jMonkeyEngine's xml format. jMonkeyEngine is a 3d game engine written in java, check link. Supported:
All Blender Objects can be exported to jMe Nodes with their location,
rotation, and size properties and their names. Optional:
* object level animation (loc, rot, size).
Meshes (tri- and quad faces, subSurfs) can have:
* deformed vertex positions * Materials,
* UV-coordinates (not sticky),
* morph target animation (by vertex keys, armature... whatever)
exported. Unsupported:
Per-face-UV, aka smoothing groups or smooth/solid setting. Contact me if you need that, or know of a good way to implement it.
Notes:
If you export animations, make sure you have only the animated mesh object selected. Keyframes will otherwise be generated for every selected object, resulting in quite a bunch of unneccessary data being saved.
Also, check the generated keyframe text in a text window, to manually tweak keyframe generation.
Animations for meshes with multiple materials or different settings of "Twoside" for their faces are currently unsupported. You'll have to split your Mesh up if you want anything like that.
Skeletal animation can be exported at your own risk, it will most probably not work. If you do so, you probably won't want to export morph target animations as well, since the skeletal deformation will then be applied twice, which will just look weird. Of course, if you give the current skeletal animation export feature a try, it will look weird anyway, because it is really nowhere near finished yet.
Have fun, and don't hesitate to send comments, claims, flames, and bug reports to hevee@gmx.de """ # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of the project nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import Blender from Blender.Mathutils import * roundAmount = 7 xMult = -1 EX_ANIMATIONS = False EX_OBJECT_ANIMATIONS = False EX_MATERIALS = True EX_VERTEXCOLORS = True EX_UVS = True CURRENT_FILENAME = None JOINT_ANIMATION = False CONV_COORDS = False CONV_COORDS_BY_OBJECT = False ONLY_TEX_FILENAME = True unTriFaces = False TextureStatesWarningShown = False HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING = False HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING = False EX_JME_1_XML = False KEYFRAMES = 'jme keyframes' ANIMHELPTEXT = \ '''This text contains the frame numbers to be exported by the jMonkeyEngine exporter. During export, keyframe information will be read from this text. Any line starting with a non-numerical string will be ignored. You can name keyframes. The name will be written to the xml file as the "name" property of the keyframepointintime. jMe won't care but you can have it there for personal reference. A name is written after the keyframe number, in the same line, separated by one or more whitespace characters (tab or space).\n''' animPupShown = False keyframe_gen_step = 5 #these are for checking if writing out morph animation for the channel in #question is neccessary at all OPTIMIZE_SIZE = True lastCO = "" lastNO = "" lastCOL = "" lastUV = "" lastIND = "" lastSPTROT = "" lastSPTSCALE = "" lastSPTTRANS = "" referenceIDs = {} ##matConvert = RotationMatrix(90, 3, 'x') * RotationMatrix(180, 3, 'z') ##matConvertInv = RotationMatrix(-90, 3, 'x') * RotationMatrix(-180, 3, 'z') ##matConvert4x4 = RotationMatrix(90, 4, 'x') * RotationMatrix(180, 4, 'z') ##matConvertInv4x4 = RotationMatrix(-90, 4, 'x') * RotationMatrix(-180, 4, 'z') ##matConvert = RotationMatrix(180, 3, 'z') ##matConvertInv = RotationMatrix(-180, 3, 'z') ##matConvert4x4 = RotationMatrix(180, 4, 'z') ##matConvertInv4x4 = RotationMatrix(-180, 4, 'z') class jmeVertex: #---coords[x,y,z], normal[x,y,z], color[r,g,b,a], uv[u,v]---#000000#FFFFFF------ global roundAmount, CONV_COORDS, CONV_COORDS_BY_OBJECT def __init__(self, xyzCoords, xyzNormal, blender_vert): if CONV_COORDS and not EX_ANIMATIONS and not CONV_COORDS_BY_OBJECT: self.coords = [xMult*xyzCoords[0], xyzCoords[2], xyzCoords[1]] self.normal = [xMult*xyzNormal[0], xyzNormal[2], xyzNormal[1]] else: self.coords = xyzCoords self.normal = xyzNormal self.color = None self.uv = None self.joint = None self.blender_vert = blender_vert def setJoint(self, joint): self.joint = joint def setRGBA(self, rgbaColor): self.color = rgbaColor def setUV(self, uvTexcoords): self.uv = uvTexcoords def copyNewColor(self, rgba): 'creates a copy of this jmeVertex with changed color' ret = jmeVertex(self.coords, self.normal, self.blender_vert) ret.setRGBA(rgba) ret.setUV(self.uv) ret.setJoint(self.joint) return ret def copyNewUV(self, uv): 'creates a copy of this jmeVertex with changed uv coords' ret = jmeVertex(self.coords, self.normal, self.blender_vert) ret.coords = self.coords ret.normal = self.normal ret.setRGBA(self.color) ret.setUV(uv) ret.setJoint(self.joint) return ret def copyNewNO(self, no): 'creates a copy of this jmeVertex with changed normal coords' ret = jmeVertex(self.coords, self.normal, self.blender_vert) ret.coords = self.coords ret.normal = no ret.setRGBA(self.color) ret.setUV(self.uv) ret.setJoint(self.joint) return ret class jmeMesh: #---name verts indices material texture---#000000#FFFFFF------------------------ def __init__(self, name, refID): self.name = name self.verts = [] self.indices = [] self.material = None self.texture = None self.oldIndices = {} self.newIndex = 0 self.refID = refID def appendVert(self, jmeVert, oldIndex): if not self.oldIndices.has_key(oldIndex): self.verts.append(jmeVert) self.oldIndices[oldIndex] = self.newIndex self.newIndex += 1 def appendIndex(self, oldIndex): ## if not self.oldIndices.has_key(oldIndex): ## self.oldIndices[oldIndex] = self.newIndex ## self.newIndex += 1 self.indices.append(self.oldIndices[oldIndex]) def setMaterial(self, jmeMat): self.material = jmeMat def setTexture(self, jmeTex): self.texture = jmeTex def setTwoSided(self, twosided): self.twosided = twosided if not twosided: self.name += '.nocull' def getVertByOldIndex(self, oldIndex): newIndex = self.oldIndices[oldIndex] return self.verts[newIndex] def toString(self, indentL, children = '', onlyVerts = False, jointmesh = False, attributes = ''): global EX_MATERIALS, lastCO, lastNO, lastCOL, lastUV, lastIND ind = makeTag(indentL+2, 'indexBuffer', ints2String('data', self.indices)) (co, no, col, uv, ji, oc, on) = buildStringsFromJmeVerts(indent(indentL+2), self.verts) tagname = 'com.jme.scene.TriMesh' jointmeshdata = '' if jointmesh: tagname = 'jointmesh' jointmeshdata = oc jointmeshdata = jointmeshdata + on jointmeshdata = jointmeshdata + ji children += jointmeshdata children += triMeshData(indentL, co + no + col + uv + ind) if not onlyVerts: matString = '' if self.material: matString += self.material.toString(indentL+2) if self.texture: matString += self.texture.toString(indentL+2) if self.twosided: matString += indent(indentL+2)+''+indent(indentL+1)+'\n' children += triMeshData(indentL, co + no + col + uv + ind) attributes += ' reference_ID="'+self.refID+'"' matString = makeTag(indentL+1, 'renderStateList', '', matString) meshStr = makeTag(indentL, tagname, 'name="'+self.name+'"' + attributes, children + matString) else:#only for KeyframeController animation, don't output material and outer mesh tags if OPTIMIZE_SIZE and lastCO == co: co = "" else: lastCO = co if OPTIMIZE_SIZE and lastNO == no: no= "" else: lastNO = no if OPTIMIZE_SIZE and lastCOL == col: col= "" else: lastCOL = col if OPTIMIZE_SIZE and lastUV == uv: uv = "" else: lastUV = uv if OPTIMIZE_SIZE and lastIND == ind: ind = "" else: lastIND = ind children += triMeshData(indentL, co + no + col + uv + ind) meshStr = children return meshStr class jmeMaterial: def __init__(self, blenderMat): ambMult = lambda x : blenderMat.getAmb() * x # f(x) = x * ambient self.alpha = blenderMat.getAlpha() self.diff = blenderMat.getRGBCol() + [self.alpha] self.amb = map(ambMult, Blender.World.GetCurrent().getAmb())+[self.alpha] emMult = lambda x : blenderMat.getEmit() * x self.emi = map(emMult, blenderMat.getRGBCol())+[self.alpha] specMult = lambda x : blenderMat.getSpec()/2 * x self.spec = map(specMult, blenderMat.getSpecCol()) + [self.alpha] self.shiny = blenderMat.getHardness() / 511.0 * 128#range 0-128, as in OpenGL def toString(self, indentL): matString = makeTag(indentL, 'com.jme.scene.state.MaterialState' , 'class="com.jme.scene.state.lwjgl.LWJGLMaterialState" shininess="'+str(self.shiny)+'"',\ rgba2String('diffuse', self.diff, indentL+1)+\ rgba2String('ambient', self.amb, indentL+1)+\ rgba2String('emissive', self.emi, indentL+1)+\ rgba2String('specular', self.spec, indentL+1)\ ) return matString class jmeTexture: def __init__(self, blenderMTex): if blenderMTex.tex.type == Blender.Texture.Types.IMAGE: self.tname = blenderMTex.tex.image.filename else: self.tname = None def toString(self, indentL): if self.tname: if self.tname.startswith("//"): self.tname = self.tname[2:] tofile = self.tname if ONLY_TEX_FILENAME: import os tofile = tofile.split(os.sep)[-1] if(EX_JME_1_XML): texString = makeTag(indentL+2, 'com.jme.image.Texture', \ 'imageLocation="'+tofile+\ '" wrap="3"') else: texString = makeTag(indentL+3, 'textureKey', 'class="com.jme.util.TextureKey" protocol="file" file="'+tofile+'"') texString = makeTag(indentL+2, 'com.jme.image.Texture2D', '', texString) texString = makeTag(indentL+1, 'texture', 'size="1"', texString) matString = makeTag(indentL, 'com.jme.scene.state.TextureState', 'class="com.jme.scene.state.lwjgl.LWJGLTextureState"', texString) return matString else: return '' class Joint: def __init__(self, name, index, parent, mat_localrot, v_localvec, blender_bone): self.name = name self.kfrot = [] self.kfloc = [] self.index = index self.parent = parent self.mat_localrot = mat_localrot self.v_localvec = v_localvec self.blender_bone = blender_bone def addKeyframeRot(self, time, quat_rot): self.kfrot.append((time, quat_rot)) def addKeyframeLoc(self, time, trip_xyz): self.kfloc.append((time, trip_xyz)) def toString(self, indentLevel, parentJoint): '''this is the point where all blender to jME coordinate space conversion takes place''' global CONV_COORDS, CONV_COORDS_BY_OBJECT indentstr = indent(indentLevel) out = indentstr+"\n" parentindex = -1 if self.parent: parentindex = self.parent.index out = out + indentstr+'" out = out +'" localrot="'+f2s(mloc[0][0])+' '+f2s(mloc[0][1])+' '+f2s(mloc[0][2])+' ' out = out+f2s(mloc[1][0])+' '+f2s(mloc[1][1])+' '+f2s(mloc[1][2])+' ' out = out +f2s(mloc[2][0])+' '+f2s(mloc[2][1])+' '+f2s(mloc[2][2])+' ' out = out +'" localvec="'+f2s(v_local[0])+' '+f2s(v_local[1])+' '+f2s(v_local[2])+'">' for kfr in self.kfrot: qkf = Quaternion((kfr[1][0],kfr[1][1],kfr[1][2],kfr[1][3])).normalize() childString += '\n'+indent(indentLevel+1)+'' out += childString out += '\n'+indentstr+'' return out #for easy switching betweem jME 1.0 and jME 2.x XML def triMeshData(indentL, childrenString): if(EX_JME_1_XML): ret = makeTag(indentL+1, 'batchList', 'size="1"', \ makeTag(indentL+2, 'com.jme.scene.batch.TriangleBatch', '', \ childrenString)); return ret; else: return childrenString; def f2s(float): # f = round(float,roundAmount) # if abs(f - round(f, 0)) < pow(10, -(roundAmount-1)): # f = int(round(f, 0)) # return str(f) return "%.*f" % (roundAmount, float) def quatXquat(q1, q2): w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w r = Quaternion(w,x,y,z) return r def getIpoValue(ipo, value): # TODO: update getIpoValue from deprecated ipo.getCurveCurval(i) ipocurves = ipo.getCurves() for i in range(len(ipocurves)): if value == ipocurves[i].getName(): return ipo.getCurveCurval(i) print "Error: ipo %s has no curve for %s!" %(ipo, value) def vec3f2String(nodeName, floatList, intIndentL=0): ret = makeTag(intIndentL, nodeName, 'x="'+f2s(floatList[0])+'" y="'+f2s(floatList[1])+'" z="'+f2s(floatList[2])+'"') return ret def quat2String(nodeName, floatList, intIndentL=0): ret = makeTag(intIndentL, nodeName, 'x="'+f2s(floatList[0])+'" y="'+f2s(floatList[1])+'" z="'+f2s(floatList[2])+'" w="'+f2s(floatList[3])+'"') return ret def rgba2String(nodeName, rgba, intIndentL=0): print rgba print rgba[0] ret = makeTag(intIndentL, nodeName, 'r="'+f2s(rgba[0])+'" g="'+f2s(rgba[1])+'" b="'+f2s(rgba[2])+'" a="'+f2s(rgba[3])+'"') return ret def floats2String(attrName, floatList): 'result will be: =" f0 f1 f2...", fx being floats from the list' if not floatList: return '' ret = attrName+'="' for i in floatList: ret += f2s(i)+' ' if len(floatList): ret = ret[:-1] ret += '"' else: ret = '' return ret def ints2String(attrName, intList): 'result will be: =" i0 i1 i2...", ix being ints from the list' if not intList: return '' ret = attrName+'="' for i in intList: ret += str(i)+' ' if len(intList): ret = ret[:-1] ret += '" size="'+str(len(intList))+'"' else: ret = '' return ret def indent(level): return ' '*level def makeTag(intIndent, strName, strAttributes, strChildren=''): if len(strAttributes) > 0: strAttributes = ' '+strAttributes if len(strChildren) > 0: ret = indent(intIndent)+'<'+strName+strAttributes+'>\n'+strChildren+indent(intIndent)+'\n' else: ret = indent(intIndent)+'<'+strName+' '+strAttributes+'/>\n' return ret def processJointMesh(ob, indentL): ''' returns tuple: (jointindexlist, jointcontrollerstring)''' ret = [None, None, None] nmesh = ob.getData() if not type(nmesh) == Blender.Types.NMeshType: print 'Not a mesh object: '+ob arm_object = ob.parent arm_object_rot = arm_object.getMatrix().toQuat().normalize() arm = arm_object.getData() #--- create a dictionary mapping bone names to indices # this is necessary because blender python does address bones only by their # names, but jME wants numerical indices. What's more, the indices have to # be sorted hierarchically, such that the root joint has index 0, it's child # index 1, and so on. #sort bones hierarchically bnamehierlist = [] def boneHierRecurs(re_bone): bnamehierlist.append(re_bone.name) if re_bone.hasChildren(): for b in re_bone.children: boneHierRecurs(b) for bone in arm.bones.values(): if bone.hasParent(): continue else: boneHierRecurs(bone) # build the actual boneindices dictionary bonesdict = {} c = 0 for name in bnamehierlist: bonesdict[name] = c c = c+1 jointindexlist = [-1 for x in range(len(nmesh.verts))] bones = arm.bones #fill jointlist with Nones jointlist = [None for x in range(len(bonesdict))] #create Joints for bonename in bnamehierlist: bone = bones[bonename] boneindex = bonesdict[bonename] pMat = arm_object.getMatrix() if bone.parent: pMat = bone.parent.matrix['ARMATURESPACE'] m = bone.matrix['ARMATURESPACE'] * pMat.invert() # .invert() inverts the matrix in place, so it has to be re-inverted pMat.invert() v = bone.matrix['ARMATURESPACE'].translationPart() if bone.parent:#this is a child bone parentindex = bonesdict[bone.parent.name] v = v - pMat.translationPart() else:#this is a root bone parentindex = -1 m = bone.matrix['ARMATURESPACE'].toQuat().normalize().toMatrix() m = pMat.toQuat().normalize().toMatrix().invert() * m #make sure m is 3x3 m = m.toQuat().normalize().toMatrix() parent = None if parentindex > -1: parent = jointlist[parentindex] if parent is None: print "ERROR! Child Joint created before parent: "+bone.name j = Joint(bone.name, boneindex, parent, m, v, bone) jointlist[boneindex] = j ret[0] = jointlist has_jointindex_data = False for vert in nmesh.verts: i = vert.index infl_list = nmesh.getVertexInfluences(i) #sort by weight, highest first, to get the bone with the highest weight value infl_list.sort(key = lambda x : x[1], reverse = True) if infl_list: has_jointindex_data = True bonename = infl_list[0][0] boneindex = bonesdict[bonename] jointindexlist[i] = boneindex else: jointindexlist[i] = -1 ret[1] = jointindexlist actions_dict = Blender.Armature.NLA.GetActions() action = actions_dict['Action'] ipomap = action.getAllChannelIpos() def processFrames(): oldframe = Blender.Get('curframe') for bone in arm.bones.values(): bone_name = bone.name if not bone_name in ipomap: continue ipo = ipomap[bone_name] boneindex = bonesdict[bone_name] joint = jointlist[boneindex] has_rot = ipo.getNcurves() in (4,7) has_loc = ipo.getNcurves() in (3,7) if(has_rot): #---get keyframes from ipo w = ipo.getCurve("QuatX") if(w): for t in w.getPoints(): frame = t.pt[0] Blender.Set('curframe', frame) time = frame#Blender.Get('curtime') ipo_rot = [ getIpoValue(ipo, "QuatW"), getIpoValue(ipo, "QuatX"), getIpoValue(ipo, "QuatY"), getIpoValue(ipo, "QuatZ") ] if(not ipo_rot[0] is None and not ipo_rot[1] is None and not ipo_rot[2] is None and not ipo_rot[3] is None): rot = Quaternion(ipo_rot).normalize() joint.addKeyframeRot(time, rot) else: print "Incomplete Quat keys for: "+str(ipo)+" "+str(ipo_rot) if(has_loc): pass # TODO: support loc and size keyframes Blender.Set('curframe', oldframe) processFrames() #create xml output string jointcontrollerstring = indent(indentL) jointcontrollerstring = jointcontrollerstring +'\n' fps = Blender.Scene.GetCurrent().getRenderingContext().framesPerSec() for joint in jointlist: jointcontrollerstring = jointcontrollerstring +joint.toString(indentL+1, joint.parent)+"\n" jointcontrollerstring = jointcontrollerstring + indent(indentL) + '\n' ret[2] = jointcontrollerstring return ret def buildStringsFromJmeVerts(indentString, ListOfJmeVerts): co = indentString+'\n'+indentString+" "+'\n'+indentString+" "+'\n' no = no[:-2] + '" size="'+str(len(ListOfJmeVerts)*3)+'"/>\n' if len(col): col = col[:-2] + '"/>\n' ## if len(ji): ## ji += '"/>\n' ## if len(oc): ## oc += '"/>\n' ## if len(on): ## on += '"/>\n' if len(uv): if(EX_JME_1_XML): uv = uv [:-2] + '" size="'+str(len(ListOfJmeVerts)*2)+'"/>\n'+indentString+'\n' else: uv = uv [:-2] + '" size="'+str(len(ListOfJmeVerts)*2)+'"/>\n'+indentString+'\n' return (co, no, col, uv, ji, oc, on) def writeObjectAnimation(blenderObject, objectname ,indentL, children=''): global lastSPTROT, lastSPTSCALE, lastSPTTRANS, OPTIMIZE_SIZE, CONV_COORDS_BY_OBJECT, CONV_COORDS fps = Blender.Scene.GetCurrent().getRenderingContext().framesPerSec() out = indent(indentL+1)+'\n' oldframe = Blender.Get('curframe') out += indent(indentL+2)+'\n' out += indent(indentL+3)+'\n' out += indent(indentL+2)+'\n' keyframes = loadKeyframes() lastSPTROT = "" lastSPTSCALE = "" lastSPTTRANS = "" keyList = keyframes.keys() keyList.sort() start = keyList[0]#Blender.Get('staframe') for i in keyList: #always append last frame if i == keyList[-1]: lastSPTROT = "" lastSPTTRANS = "" lastSPTSCALE = "" Blender.Set('curframe', i) kfname = keyframes[i] ob = Blender.Object.Get(objectname) mat = ob.getMatrix('worldspace') if CONV_COORDS: mat = mat * matConvert4x4 rotQ = mat.toQuat().normalize() rot = floats2String("rotvalues", [rotQ.x, rotQ.y, rotQ.z, rotQ.w]) if OPTIMIZE_SIZE and rot == lastSPTROT: rot = "" else: lastSPTROT = rot rot = makeTag(indentL+3, "sptrot", 'index="0" '+ rot) trans = floats2String("transvalues", mat.translationPart()) if OPTIMIZE_SIZE and trans == lastSPTTRANS: trans = "" else: lastSPTTRANS = trans trans = makeTag(indentL+3, "spttrans", 'index="0" '+ trans) scale = floats2String("scalevalues", ob.getSize()) if OPTIMIZE_SIZE and scale == lastSPTSCALE: scale = "" else: lastSPTSCALE = scale scale = makeTag(indentL+3, "sptscale", 'index="0" '+ scale) content = scale+rot+trans nowTime = i - start if len(scale) or len(trans) or len(rot): if len(kfname): out += indent(indentL+2)+'\n'+content else: out += indent(indentL+2)+'\n'+content out += indent(indentL+2)+'\n' out += children+indent(indentL)+'\n' Blender.Set('curframe', oldframe) return out def writeMorphAnimation(nmeshObject, meshname, refID, indentL, children=''): global lastCO, lastNO, lastCOL, lastUV, lastIND, OPTIMIZE_SIZE fps = Blender.Scene.GetCurrent().getRenderingContext().framesPerSec() oldframe = Blender.Get('curframe') BLENDER_FPS = 25 lastCO = "" lastNO = "" lastCOL = "" lastUV = "" lastIND = "" keyframes = loadKeyframes() keyList = keyframes.keys() keyList.sort() out = indent(indentL)+'\n' out += indent(indentL)+'\n' out += indent(indentL)+'\n' start = keyList[0]#Blender.Get('staframe') Blender.Set('curframe', keyList[0]) startTime = Blender.Get('curtime') / BLENDER_FPS for i in keyList: #always append last frame if i == keyList[-1]: lastCO = "" lastNO = "" lastCOL = "" lastUV = "" lastIND = "" Blender.Set('curframe', i) kfname = keyframes[i] nmesh = Blender.NMesh.GetRawFromObject(nmeshObject.getName())#get mesh with deformations applied mstr = writeMesh(nmesh, meshname, '',indentL+3, onlyVerts = True)#don't get materials, and mesh tags mstr = makeTag(indentL+2, 'newShape', 'class="com.jme.scene.TriMesh" name="shapeKey"', mstr) nowTime = i - start##Blender.Get('curtime') / BLENDER_FPS - startTime if len( mstr): if len(kfname): out += indent(indentL+1)+'\n' else: out += indent(indentL+1)+'\n' out += mstr out += indent(indentL+1)+'\n' out += children out += indent(indentL)+'\n' out += indent(indentL)+'\n' out = makeTag(indentL, 'geometricalControllers', 'size="1"', out) Blender.Set('curframe', oldframe) return out def getReferenceID(object): if not object in referenceIDs.keys(): referenceIDs[object] = "ID_"+str(len(referenceIDs)) return referenceIDs[object] def writeObject(ob, indentL, children = ''): global EX_ANIMATIONS, EX_OBJECT_ANIMATIONS, CONV_COORDS, JOINT_ANIMATION, CONV_COORDS_BY_OBJECT if EX_OBJECT_ANIMATIONS: CONV_COORDS_BY_OBJECT = True old_CONV_COORDS_BY_OBJECT = CONV_COORDS_BY_OBJECT if ob.getType() == 'Mesh': mesh = Blender.NMesh.GetRawFromObject(ob.getName()) meshname = ob.getData().name refID = getReferenceID(ob.getData()) if len(mesh.verts):#some mesh objects might contain no vertices at all. skip the mesh, then, but keep their object if EX_ANIMATIONS: maStr = writeMorphAnimation(ob, meshname, refID,indentL+2) dataStr = makeTag(indentL+1, 'children', 'size="1"', writeMesh(ob.getData(), meshname, refID,indentL+1, children=maStr)) elif JOINT_ANIMATION and ob.getParent() and ob.getParent().getType() == 'Armature': #print "Joint animation not implemented... please be patient" mesh = ob.getData() jointlist, jointindexlist, jointcontroller = processJointMesh(ob, indentL+1) dataStr = writeJointMesh(ob.getData(), meshname, indentL+1, children='', onlyVerts = False, jointindexlist = jointindexlist, jointlist = jointlist) dataStr = dataStr + jointcontroller else: dataStr = makeTag(indentL+1, 'children', 'size="1"', writeMesh(ob.getData(), meshname, refID,indentL+1)) else: dataStr = '' else: dataStr = '' mat = ob.getMatrix('worldspace') if CONV_COORDS: ## if CONV_COORDS_BY_OBJECT:#don't convert matrix otherwise, since verts are converted anyway ## mat = mat * matConvert4x4 mat = mat * matConvert4x4 rotQ = mat.toQuat().normalize() rot = quat2String("localRotation", [rotQ.x, rotQ.z, rotQ.y, rotQ.w], indentL+1) trans = vec3f2String("localTranslation", [xMult*mat.translationPart()[0], mat.translationPart()[2], mat.translationPart()[1]], indentL+1) scale = vec3f2String("localScale", [ob.getSize()[0],ob.getSize()[2],ob.getSize()[1]], indentL+1) else: ## mat = mat * matConvert.resize4x4() rotQ = mat.toQuat().normalize() rot = quat2String("localRotation", [rotQ.x, rotQ.y, rotQ.z, rotQ.w], indentL+1) trans = vec3f2String("localTranslation", mat.translationPart(), indentL+1) scale = vec3f2String("localScale", ob.getSize(), indentL+1) sharedident = ' reference_ID="'+getReferenceID(ob)+'" ' if EX_OBJECT_ANIMATIONS: dataStr += writeObjectAnimation(ob, ob.getName(),indentL+1) CONV_COORDS_BY_OBJECT = old_CONV_COORDS_BY_OBJECT children = trans+rot+scale; nodeStr = makeTag(indentL, 'com.jme.scene.Node', sharedident+'name="'+ob.getName()+'" ', dataStr+children) return nodeStr def writeMesh(mesh, meshname, refID, indentL = 0, children = '', onlyVerts = False): global roundAmount, unTriFaces global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS global HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING, HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING global CONV_COORDS jmeMeshes = {} # key format is (materialIndex, isDoubleSided) mindex = 0 if EX_MATERIALS: materials = mesh.getMaterials() else: materials = [] for m in materials: if len(materials) > 1: if EX_ANIMATIONS and not HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING: Blender.Draw.PupMenu("Warning:%t|Morph Target Animation for single Meshes with \ multiple Materials will NOT WORK. Please split \ your mesh up! (See 'notes' in script docs)") HAS_SHOWN_MTA_MATERIAL_SPLIT_WARNING = True j = jmeMesh(meshname+'.'+m.getName(), refID) else: j = jmeMesh(meshname, refID) if EX_MATERIALS: j.setMaterial(jmeMaterial(m)) jmeMeshes[(mindex, None)] = j mindex += 1 if not len(materials):# a blender NMesh may have no material at all jmeMeshes[(0, None)] = jmeMesh(meshname, refID) numJmeVerts = [len(mesh.verts)] # to make this accessible from within processVertInFace, it cannot be an int, but must be a list. oh wel.. #----faces processing (indices, colors, uvs)---#000000#FFFFFF------------------------------------------- def processVertInFace(face, vertindex): global HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING if EX_MATERIALS: matIndex = face.materialIndex else: matIndex = 0 vert = face.v[vertindex] #----vertex processing (vertex coords, normals)---#000000#FFFFFF------------------------------------------ twosided = face.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE'] #---make different materials and CullStates different meshes---#000000#FFFFFF--------------------------------- jmeVert = jmeVertex([vert.co[0], vert.co[1], vert.co[2]], [vert.no[0], vert.no[1], vert.no[2]], vert) if jmeMeshes.has_key((matIndex, twosided)): jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index) elif jmeMeshes.has_key((matIndex, None)): # matIndex exists, but twosided has not yet been set jmeMeshes[(matIndex, twosided)] = jmeMeshes.pop((matIndex, None)) jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index) else:# matIndex exists, but not with this twosided value if EX_MATERIALS: newmesh = jmeMesh(meshname+'.'+materials[matIndex].name, refID) else: newmesh = jmeMesh(meshname, refID) if EX_ANIMATIONS and not HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING: Blender.Draw.PupMenu("Warning:%t|Morph Target Animation for single Meshes with \ different twosided-values among their faces will not work as expected. Please split \ your mesh up! (See 'notes' in script docs)") HAS_SHOWN_MTA_TWOSIDED_SPLIT_WARNING = True newmesh.setMaterial(jmeMeshes[(matIndex, not twosided)].material) newmesh.setTexture(jmeMeshes[(matIndex, not twosided)].texture) jmeMeshes[(matIndex, twosided)] = newmesh jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index) retIndex = vert.index if(len(face.col) and EX_VERTEXCOLORS): curCol = [ face.col[vertindex].r/255.0,\ face.col[vertindex].g/255.0,\ face.col[vertindex].b/255.0,\ face.col[vertindex].a/255.0] if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color: jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setRGBA(curCol) # TODO: this might be bad, I just thought that vertex colors are by # shared vertex anyway, and commented out this whole block to prevent a # bug resulting in wrong vertex indices happening in there ## elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color <> curCol:#create a new jmeVertex ## newvert = jmeMeshes[(matIndex,twosided)].getVertByOldIndex(retIndex).copyNewColor(curCol) ## numJmeVerts[0] += 1 ## retIndex = numJmeVerts[0] - 1 ## jmeMeshes[(matIndex,twosided)].appendVert(newvert, retIndex) # TODO: support sticky uvs (would anybody need them, anyway?) if(len(face.uv) and EX_UVS and mesh.hasFaceUV()): curUV = [face.uv[vertindex][0], face.uv[vertindex][1]] if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv: jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setUV(curUV) elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv <> curUV:#create a new jmeVertex newvert = jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).copyNewUV(curUV) numJmeVerts[0] += 1 retIndex = numJmeVerts[0] - 1 jmeMeshes[(matIndex, twosided)].appendVert(newvert, retIndex) return retIndex for f in mesh.faces: if EX_MATERIALS: matIndex = f.materialIndex else: matIndex = 0 twosided = f.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE'] if len(f.v) == 3: for vindex in range(3):#loop through the 3 vertices indx = processVertInFace(f, vindex) jmeMeshes[(matIndex, twosided)].appendIndex(indx) ## indices.append(indx) elif len(f.v) == 4:# triangulate face for vindex in [0,1,2]:#loop through the first 3 vertices indx = processVertInFace(f, vindex) jmeMeshes[(matIndex, twosided)].appendIndex(indx) ## indices.append(indx) for vindex in [2,3,0]:#loop through the last 3 vertices indx = processVertInFace(f, vindex) jmeMeshes[(matIndex, twosided)].appendIndex(indx) ## indices.append(indx) else:#if len(f.v) < 3 or >4 show a message if not unTriFaces:#check if we have already shown this message... Blender.Draw.PupMenu("Export error%t|one or more faces have < 3 or >4 vertices.") unTriFaces = 1 #----materials creation---#000000#FFFFFF----------------------------------------- if(EX_MATERIALS and not onlyVerts): matIndex = 0 for m in mesh.getMaterials():#take only the first material... for now... if type(m) == Blender.Types.MaterialType: if jmeMeshes.has_key((matIndex, None)): jmeMeshes[(matIndex, None)].setMaterial(jmeMaterial(m)) elif jmeMeshes.has_key((matIndex, True)): jmeMeshes[(matIndex, True)].setMaterial(jmeMaterial(m)) elif jmeMeshes.has_key((matIndex, False)): jmeMeshes[(matIndex, False)].setMaterial(jmeMaterial(m)) mtex = m.getTextures()[0] if type(mtex) == Blender.Types.MTexType: if jmeMeshes.has_key((matIndex, None)): jmeMeshes[(matIndex, None)].setTexture(jmeTexture(mtex)) if jmeMeshes.has_key((matIndex, True)): jmeMeshes[(matIndex, True)].setTexture(jmeTexture(mtex)) if jmeMeshes.has_key((matIndex, False)): jmeMeshes[(matIndex, False)].setTexture(jmeTexture(mtex)) matIndex += 1 ret = '' for key in jmeMeshes.keys(): twosided = key[1] value = jmeMeshes[key] value.setTwoSided(twosided) ret += value.toString(indentL, children, onlyVerts = onlyVerts) return ret def writeJointMesh(mesh, meshname, refID,indentL = 0, children = '', onlyVerts = False, jointindexlist = [], jointlist = []): global roundAmount, unTriFaces global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS global CONV_COORDS jmeMeshes = {} # key format is (materialIndex, isDoubleSided) mindex = 0 if EX_MATERIALS: materials = mesh.getMaterials() else: materials = [] for m in materials: if len(materials) > 1: j = jmeMesh(meshname+'.'+m.getName(), refID) else: j = jmeMesh(meshname, refID) if EX_MATERIALS: j.setMaterial(jmeMaterial(m)) jmeMeshes[(mindex, None)] = j mindex += 1 if not len(materials):# a blender NMesh can have no material at all jmeMeshes[(0, None)] = jmeMesh(meshname, refID) numJmeVerts = [len(mesh.verts)] # to make this accessible from within processVertInFace, it cannot be an int, but must be a list. oh wel.. #----faces processing (indices, colors, uvs)---#000000#FFFFFF------------------------------------------- def processVertInFace(face, vertindex): ## global jointindexlist, jointlist if EX_MATERIALS: matIndex = face.materialIndex else: matIndex = 0 vert = face.v[vertindex] #----vertex processing (vertex coords, normals)---#000000#FFFFFF------------------------------------------ twosided = face.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE'] #---make different materials and CullStates different meshes---#000000#FFFFFF--------------------------------- jmeVert = jmeVertex([vert.co[0], vert.co[1], vert.co[2]], [vert.no[0], vert.no[1], vert.no[2]], vert) if jointindexlist: ix = jointindexlist[vert.index] if ix > -1: jmeVert.setJoint(jointlist[ix]) else: jmeVert.setJoint(None) if jmeMeshes.has_key((matIndex, twosided)): jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index) elif jmeMeshes.has_key((matIndex, None)): # matIndex exists, but twosided has not yet been set jmeMeshes[(matIndex, twosided)] = jmeMeshes.pop((matIndex, None)) jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index) else:# matIndex exists, but not with this twosided value if EX_MATERIALS: newmesh = jmeMesh(meshname+'.'+materials[matIndex].name, refID) else: newmesh = jmeMesh(meshname, refID) newmesh.setMaterial(jmeMeshes[(matIndex, not twosided)].material) newmesh.setTexture(jmeMeshes[(matIndex, not twosided)].texture) jmeMeshes[(matIndex, twosided)] = newmesh jmeMeshes[(matIndex, twosided)].appendVert(jmeVert, vert.index) retIndex = vert.index if(len(face.col) and EX_VERTEXCOLORS): curCol = [ face.col[vertindex].r/255.0,\ face.col[vertindex].g/255.0,\ face.col[vertindex].b/255.0,\ face.col[vertindex].a/255.0] if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color: jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setRGBA(curCol) elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).color <> curCol:#create a new jmeVertex newvert = jmeMeshes[(matIndex,twosided)].getVertByOldIndex(retIndex).copyNewColor(curCol) numJmeVerts[0] += 1 retIndex = numJmeVerts[0] - 1 jmeMeshes[(matIndex,twosided)].appendVert(newvert, retIndex) # TODO: support sticky uvs (would anybody need them, anyway?) if(len(face.uv) and EX_UVS and mesh.hasFaceUV()): curUV = [face.uv[vertindex][0], face.uv[vertindex][1]] if not jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv: jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).setUV(curUV) elif jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).uv <> curUV:#create a new jmeVertex newvert = jmeMeshes[(matIndex, twosided)].getVertByOldIndex(retIndex).copyNewUV(curUV) numJmeVerts[0] += 1 retIndex = numJmeVerts[0] - 1 jmeMeshes[(matIndex, twosided)].appendVert(newvert, retIndex) return retIndex for f in mesh.faces: if EX_MATERIALS: matIndex = f.materialIndex else: matIndex = 0 twosided = f.mode & Blender.NMesh.FaceModes['TWOSIDE'] == Blender.NMesh.FaceModes['TWOSIDE'] if len(f.v) == 3: for vindex in range(3):#loop through the 3 vertices indx = processVertInFace(f, vindex) jmeMeshes[(matIndex, twosided)].appendIndex(indx) ## indices.append(indx) elif len(f.v) == 4:# triangulate face for vindex in [0,1,2]:#loop through the first 3 vertices indx = processVertInFace(f, vindex) jmeMeshes[(matIndex, twosided)].appendIndex(indx) ## indices.append(indx) for vindex in [2,3,0]:#loop through the last 3 vertices indx = processVertInFace(f, vindex) jmeMeshes[(matIndex, twosided)].appendIndex(indx) ## indices.append(indx) else:#if len(f.v) < 3 or >4 show a message if not unTriFaces:#check if we have already shown this message... Blender.Draw.PupMenu("Export error%t|one or more faces have < 3 or >4 vertices.") unTriFaces = 1 #----materials creation---#000000#FFFFFF----------------------------------------- if(EX_MATERIALS and not onlyVerts): matIndex = 0 for m in mesh.getMaterials():#take only the first material... for now... if type(m) == Blender.Types.MaterialType: if jmeMeshes.has_key((matIndex, None)): jmeMeshes[(matIndex, None)].setMaterial(jmeMaterial(m)) elif jmeMeshes.has_key((matIndex, True)): jmeMeshes[(matIndex, True)].setMaterial(jmeMaterial(m)) elif jmeMeshes.has_key((matIndex, False)): jmeMeshes[(matIndex, False)].setMaterial(jmeMaterial(m)) mtex = m.getTextures()[0] if type(mtex) == Blender.Types.MTexType: if jmeMeshes.has_key((matIndex, None)): jmeMeshes[(matIndex, None)].setTexture(jmeTexture(mtex)) if jmeMeshes.has_key((matIndex, True)): jmeMeshes[(matIndex, True)].setTexture(jmeTexture(mtex)) if jmeMeshes.has_key((matIndex, False)): jmeMeshes[(matIndex, False)].setTexture(jmeTexture(mtex)) matIndex += 1 ret = '' for key in jmeMeshes.keys(): twosided = key[1] value = jmeMeshes[key] value.setTwoSided(twosided) ret += value.toString(indentL, children, onlyVerts = False, jointmesh = True) return ret def keyframesToBlenderText(keyframes): try: text = Blender.Text.Get(KEYFRAMES) text.clear() except NameError:# text doesn't exist, this means that keyframes have been generated text = Blender.Text.New(KEYFRAMES) text.write(ANIMHELPTEXT+"\n") text.set('follow_cursor', 0)#don't confuse the user by scrolling to the text's end ks = keyframes.keys() ks.sort() for i in ks: if len(keyframes[i]): text.write(str(i)+"\t"+keyframes[i]+"\n") else: text.write(str(i)+"\n") ## text.set('follow_cursor', 1) def textToKFDict(blenderText): ret = {} for i in blenderText.asLines(): if len(i): kfnum = i.split()[0] kfname = '' if len(i.split(None, 1)) >= 2: kfname = i.split(None, 1)[1] try: ret[int(kfnum)] = kfname#None as separator: behave as in split() except ValueError: #assume it's a comment... pass return ret def loadKeyframes(FORCE_NEW_KEYFRAMES = False): global animPupShown, keyframe_gen_step ret = {} start = Blender.Get('staframe') end = Blender.Get('endframe') if(FORCE_NEW_KEYFRAMES): ssel = Blender.Draw.PupIntInput("Keyframe step: ", keyframe_gen_step, 1, 9999) if ssel: keyframe_gen_step = ssel exists = True try: ret = textToKFDict(Blender.Text.Get(KEYFRAMES)) if not FORCE_NEW_KEYFRAMES: return ret except NameError:#a text named is not found, generate keyframes exists = False if not animPupShown: animPupShown = True Blender.Draw.PupMenu('Morph target animation keyframes generated%t|Check text "jme keyframes" in a text window') if exists: isel = Blender.Draw.PupMenu('Overwrite existing keyframes?%t|Yes|No') if isel <> 1: return ret else: ret = {} ret[start] = 'keyframe names go here' for i in range(start+keyframe_gen_step, end, keyframe_gen_step): ret[i] = '' ret[end] = '' keyframesToBlenderText(ret)#save the generated keyframes in a text window return ret def main(filename): global CURRENT_FILENAME,CONV_COORDS update_RegistryInfo() def buildObjectHierarchy(ObjectsList): '''build a top-down hierarchy of blender objects, which only support getParent()''' toplevel = {} hier = {} for o in ObjectsList: p = o.getParent() if p: if hier.has_key(p.getName()): hier[p.getName()].append(o.getName()) else: hier[p.getName()] = [o.getName()] else: toplevel[o.getName()] = {} def recurse(cc): ret = {} if(hier.has_key(cc)): for i in hier[cc]: ret[i] = recurse(i) return ret for t in toplevel.keys(): if hier.has_key(t): for c in hier[t]: toplevel[t][c] = recurse(c) return toplevel def writeObjectsHierarchy(oDict, indentL=0): ret = '' for i in oDict.keys(): ret += writeObject( Blender.Object.Get(i), \ indentL, \ writeObjectsHierarchy(oDict[i], indentL+1)) return ret print "starting export to jME XML file format..." print "-----------------------------------------" if Blender.Window.EditMode(): Blender.Window.EditMode(0) result = '\n' result += '\n' obList = Blender.Object.GetSelected() result += '\n' # TODO: hierarchy is not used right now ## oDict = buildObjectHierarchy(Blender.Object.Get()) ## result += writeObjectsHierarchy(oDict, 1) objects = '' step = 0.95 / len(obList) pos = 0.0 objectContent = False#flag to indicate if anything containing exportable data has been selected for obj in Blender.Object.GetSelected(): obstr = writeObject(obj, 2) ## print obstr[-3] if not obstr[-3] is "/": objectContent = True objects += obstr Blender.Window.DrawProgressBar(pos,'Exporting '+obj.getName()) pos += step result += objects result += '\n' print "-----------------------------------------" print "done exporting to jME XML file format." if not objectContent: Blender.Draw.PupMenu("Warning:%t|No objects with exportable data (e.g. meshes) exported!") if type(filename) == type(''): CURRENT_FILENAME = filename if filename.find('.xml', -4) <= 0: filename += '.xml' file = open(filename, "w") Blender.Window.DrawProgressBar(0.96,'Writing xml file...') try: file.write(result) finally: file.close() else: Blender.Window.DrawProgressBar(0.96,'Sending xml...') try: filename.send(result) except: Blender.Draw.PupMenu("Error:%t|Unable to send xml to server") finally: filename.close() Blender.Window.DrawProgressBar(1.0,'Done! jME Export finished.') def gui(): global CURRENT_FILENAME if CURRENT_FILENAME and len(CURRENT_FILENAME): i = CURRENT_FILENAME.rfind('.') if i > 0: CURRENT_FILENAME = CURRENT_FILENAME[:i] + ".xml" Blender.Window.FileSelector(main, "Export jME XML", CURRENT_FILENAME) else: Blender.Window.FileSelector(main, "Export jME XML") def draw(): global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME global CONV_COORDS_BY_OBJECT # clearing screen Blender.BGL.glClearColor(0.7, 0.7, 0.7, 1) Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT) # background width, height = Blender.Window.GetAreaSize() x = width / 2 - 335 / 2 y = height - 240 if x < 10: x = 10 if y < 220: y = 220 Blender.BGL.glColor3f(0.9, 0.9, 0.9) Blender.BGL.glRectf(x - 10,y,width - x, y - 222) lh1 = 16 # logo Blender.BGL.glColor3f(0.878,0.773,0.545) Blender.BGL.glRectf(x - 10, y + 14, width - x ,y-2) Blender.BGL.glColor3f(0.28,0.2,0) Blender.BGL.glRectf(x - 12, y + 16, width - x - 2,y) Blender.BGL.glRasterPos2d(x-10, y - 15) Blender.BGL.glEnable(Blender.BGL.GL_BLEND) Blender.BGL.glBlendFunc(Blender.BGL.GL_SRC_ALPHA, Blender.BGL.GL_ONE_MINUS_SRC_ALPHA) Blender.BGL.glDrawPixels(64, 64, Blender.BGL.GL_RGBA, Blender.BGL.GL_BYTE, LOGO) Blender.BGL.glDisable(Blender.BGL.GL_BLEND) Blender.BGL.glColor3f(0.2, 0.2, 0.2) Blender.BGL.glRasterPos2d(x + 55+1, y+4+1) Blender.Draw.Text("jME Exporter") Blender.BGL.glColor3f(1, 1, 1) Blender.BGL.glRasterPos2d(x + 55, y+4) Blender.Draw.Text("jME Exporter * Version 2 *", "large") # text Blender.BGL.glColor3f(0, 0, 0) Blender.Draw.Button("Help",10, x+270, y+2, (width-x) - (x+275), 14) y -= 25 Blender.BGL.glRasterPos2d(x+10, y) Blender.Draw.Text("All selected Objects will be exported to jme Nodes.",'small') y -= lh1 - 3 Blender.BGL.glRasterPos2d(x+10, y) Blender.Draw.Text("Only meshes will have data, every Node will have loc, rot and size.",'small') y -= lh1 Blender.BGL.glRasterPos2d(x+10, y) Blender.Draw.Text("TextureStates will be created from the first Texture in",'small') y -= lh1 - 3 Blender.BGL.glRasterPos2d(x+10, y) Blender.Draw.Text("the Object's Material.",'small') # Buttons y -= 40 col2x = x+170 Blender.Draw.Toggle("Export materials", 5, x, y, 155, 20, EX_MATERIALS, '') Blender.Draw.Toggle("Object animations", 8, col2x, y, 155, 20, EX_OBJECT_ANIMATIONS, '') y -= 22 Blender.Draw.Toggle("Export texture coordinates", 4, x, y, 155, 20, EX_UVS, '') Blender.Draw.Toggle("Morph Target animations", 3, col2x, y, 155, 20, EX_ANIMATIONS, '') y -= 22 Blender.Draw.Toggle("Export vertex colors", 6, x, y, 155, 20, EX_VERTEXCOLORS, '') ## Blender.Draw.Toggle("Skeletal animations", 7, col2x, y, 155, 20, JOINT_ANIMATION, '') y -= 22 ## Blender.Draw.Toggle("Object coord conversion", 11, x, y, 155, 20, CONV_COORDS_BY_OBJECT, 'Convert coords by object rotation, rather than vertex placement') Blender.Draw.Button("Generate Keyframes", 9, col2x, y, 155, 20, 'Creates keyframes every frames, where can be adjusted') y -= 40 Blender.Draw.Button("Export", 2, x, y, 107, 25) Blender.Draw.Button("Cancel", 1, x+109, y, 107, 25) Blender.Draw.Button("Send", 30, x+218, y, 107, 25, 'Attempts to send xml to a server') def update_RegistryInfo(): global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME, EX_OBJECT_ANIMATIONS global CONV_COORDS_BY_OBJECT, JOINT_ANIMATION,animPupShown, keyframe_gen_step d = {} d['EX_ANIMATIONS'] = EX_ANIMATIONS d['EX_MATERIALS'] = EX_MATERIALS d['EX_VERTEXCOLORS'] = EX_VERTEXCOLORS d['EX_UVS'] = EX_UVS if type(CURRENT_FILENAME) == type(''): d['CURRENT_FILENAME'] = CURRENT_FILENAME else: d['CURRENT_FILENAME'] = None d['KEYFRAMES'] = KEYFRAMES d['EX_OBJECT_ANIMATIONS'] = EX_OBJECT_ANIMATIONS d['JOINT_ANIMATION'] = JOINT_ANIMATION d['animPupShown'] = animPupShown d['keyframe_gen_step'] = keyframe_gen_step d['CONV_COORDS_BY_OBJECT'] = CONV_COORDS_BY_OBJECT Blender.Registry.SetKey('jmeExport', d) def load_RegistryInfo(): global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME, EX_OBJECT_ANIMATIONS global CONV_COORDS, KEYFRAMES, JOINT_ANIMATION, animPupShown, keyframe_gen_step d = Blender.Registry.GetKey('jmeExport') if d: try: EX_ANIMATIONS = d['EX_ANIMATIONS'] EX_MATERIALS = d['EX_MATERIALS'] EX_VERTEXCOLORS = d['EX_VERTEXCOLORS'] EX_UVS = d['EX_UVS'] CURRENT_FILENAME = d['CURRENT_FILENAME'] KEYFRAMES = d['KEYFRAMES'] EX_OBJECT_ANIMATIONS = d['EX_OBJECT_ANIMATIONS'] JOINT_ANIMATION = d['JOINT_ANIMATION'] animPupShown = d['animPupShown'] keyframe_gen_step = d['keyframe_gen_step'] ## CONV_COORDS_BY_OBJECT = d['CONV_COORDS_BY_OBJECT'] except: pass def bevent(evt): global EX_ANIMATIONS,EX_MATERIALS, EX_VERTEXCOLORS, EX_UVS, CURRENT_FILENAME, EX_OBJECT_ANIMATIONS global CONV_COORDS_BY_OBJECT, JOINT_ANIMATION global TextureStatesWarningShown global animPupShown if evt == 1: # Cancel Blender.Draw.Exit() elif evt == 2: # Export if not len(Blender.Object.GetSelected()): Blender.Draw.PupMenu("Error:%t|Nothing selected!") return update_RegistryInfo() Blender.Draw.Exit() gui() elif evt == 3:#ex anim loadKeyframes() EX_ANIMATIONS = not EX_ANIMATIONS if EX_ANIMATIONS and JOINT_ANIMATION: Blender.Draw.PupMenu("Warning%t|It is not recommendable to export skeletal and morph target animation at the same time. See help.") Blender.Draw.Redraw(1) elif evt == 4:#ex uvs EX_UVS = not EX_UVS if EX_UVS and not EX_MATERIALS and not TextureStatesWarningShown: TextureStatesWarningShown = True Blender.Draw.PupMenu("Warning%t|TextureStates will only be created if Export Material is set. UVs will be created, though.") Blender.Draw.Redraw(1) elif evt == 5:#ex materials EX_MATERIALS = not EX_MATERIALS if EX_UVS and not EX_MATERIALS and not TextureStatesWarningShown: TextureStatesWarningShown = True Blender.Draw.PupMenu("Warning%t|TextureStates will only be created if Export Material is set. UVs will be created, though.") Blender.Draw.Redraw(1) elif evt == 6:#ex vertex colors EX_VERTEXCOLORS = not EX_VERTEXCOLORS Blender.Draw.Redraw(1) elif evt == 7:#JOINT_ANIMATION JOINT_ANIMATION = not JOINT_ANIMATION if JOINT_ANIMATION: Blender.Draw.PupMenu("Warning%t|Skeletal animation does NOT work currently. Hopefully,.this will be fixed soon, but at present, there is no guarantee at all.") if EX_ANIMATIONS and JOINT_ANIMATION: Blender.Draw.PupMenu("Warning%t|It is not recommendable to export skeletal and morph target animation at the same time. See help.") Blender.Draw.Redraw(1) elif evt == 8:#ex objectanim loadKeyframes() EX_OBJECT_ANIMATIONS = not EX_OBJECT_ANIMATIONS Blender.Draw.Redraw(1) elif evt == 9:#generate keyframes loadKeyframes(True) update_RegistryInfo() Blender.Draw.Redraw(1) elif evt == 10:#show help Blender.Draw.PupMenu("Info%t|Please use Help->Scripts Help Browser in the Blender menu") #the following crashes Blender 2.41 when the script is cancelled an restarted (WinXP) #Blender.ShowHelp('jmeXMLExport.py') Blender.Draw.Redraw(1) ## elif evt == 11:#coord conversion ## CONV_COORDS_BY_OBJECT = not CONV_COORDS_BY_OBJECT ## Blender.Draw.Redraw(1) elif evt == 30:#net send import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("localhost", 5678)) main(s) except: Blender.Draw.PupMenu("Error::%t|Cannot connect to host") Blender.Draw.Redraw(1) def event(evt, val): if evt == Blender.Draw.ESCKEY and not val: Blender.Draw.Exit() LOGO = Blender.BGL.Buffer(Blender.BGL.GL_BYTE, [64, 64*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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 39, 21, 99, 56, 49, 27, 124, 66, 58, 33, 127, 71, 61, 32, 127, 75, 65, 33, 127, 79, 67, 34, 127, 81, 69, 35, 127, 81, 69, 34, 127, 78, 66, 33, 127, 74, 63, 33, 127, 68, 58, 32, 127, 58, 51, 30, 112, 34, 33, 21, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 44, 25, 91, 61, 52, 27, 105, 71, 61, 32, 108, 76, 65, 33, 121, 88, 75, 39, 127, 88, 75, 39, 127, 89, 75, 40, 127, 89, 75, 40, 127, 88, 75, 39, 127, 87, 75, 39, 127, 88, 75, 40, 127, 89, 75, 40, 127, 88, 75, 39, 127, 88, 75, 39, 127, 79, 67, 35, 124, 74, 64, 33, 111, 62, 54, 29, 106, 50, 43, 25, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 41, 24, 91, 61, 52, 29, 105, 74, 63, 33, 109, 79, 68, 35, 123, 89, 75, 40, 127, 88, 76, 38, 127, 90, 75, 40, 127, 91, 78, 40, 127, 93, 79, 42, 127, 94, 80, 42, 127, 94, 80, 42, 127, 93, 79, 41, 127, 92, 78, 40, 127, 90, 77, 40, 127, 89, 76, 39, 127, 88, 75, 39, 127, 88, 75, 39, 127, 89, 75, 40, 127, 88, 75, 39, 127, 90, 75, 39, 127, 75, 64, 34, 123, 61, 52, 28, 95, 45, 43, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 42, 23, 91, 64, 56, 29, 109, 77, 66, 34, 123, 89, 75, 40, 127, 92, 78, 41, 127, 96, 82, 43, 127, 101, 87, 46, 127, 106, 89, 45, 127, 109, 92, 48, 127, 108, 91, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 47, 127, 107, 90, 45, 127, 102, 88, 45, 127, 97, 82, 43, 127, 91, 77, 40, 127, 88, 75, 40, 127, 89, 75, 41, 127, 88, 75, 40, 127, 79, 67, 34, 124, 65, 56, 32, 109, 44, 39, 27, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 41, 32, 36, 66, 56, 30, 99, 79, 67, 36, 123, 93, 78, 41, 127, 100, 85, 44, 127, 106, 89, 47, 127, 109, 92, 48, 127, 109, 92, 49, 127, 109, 92, 48, 127, 109, 92, 47, 127, 109, 92, 47, 127, 109, 92, 47, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 109, 92, 47, 127, 108, 92, 48, 127, 102, 87, 44, 127, 92, 80, 41, 127, 89, 76, 41, 127, 87, 75, 41, 127, 88, 75, 38, 127, 65, 57, 31, 114, 40, 39, 30, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 48, 28, 92, 77, 66, 35, 113, 90, 76, 39, 124, 105, 89, 46, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 101, 86, 45, 127, 90, 77, 40, 127, 88, 76, 39, 127, 80, 68, 35, 125, 64, 55, 28, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 57, 30, 95, 86, 73, 38, 123, 106, 90, 46, 127, 109, 93, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 49, 127, 109, 93, 48, 127, 106, 90, 48, 127, 94, 79, 42, 127, 88, 74, 41, 127, 76, 66, 33, 123, 54, 47, 26, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 63, 33, 95, 93, 78, 40, 123, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 48, 127, 108, 91, 47, 127, 96, 81, 44, 127, 87, 75, 39, 127, 70, 60, 31, 110, 45, 40, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 62, 32, 95, 95, 80, 41, 123, 109, 92, 49, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 109, 92, 48, 127, 95, 81, 43, 127, 80, 68, 35, 124, 54, 47, 25, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 55, 29, 92, 93, 78, 40, 123, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 108, 91, 48, 127, 107, 92, 48, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 109, 91, 47, 127, 93, 79, 42, 127, 64, 54, 29, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 48, 34, 35, 86, 73, 39, 113, 110, 92, 49, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 106, 89, 45, 127, 56, 46, 28, 127, 100, 87, 44, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 105, 90, 47, 127, 78, 65, 34, 110, 30, 31, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 50, 28, 45, 40, 33, 27, 19, 63, 54, 30, 101, 89, 76, 40, 124, 108, 92, 47, 127, 109, 92, 48, 127, 108, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 107, 91, 47, 127, 59, 50, 29, 127, 110, 92, 48, 127, 109, 91, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 87, 74, 38, 124, 43, 36, 18, 97, 34, 30, 22, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 53, 28, 89, 86, 74, 39, 111, 91, 78, 41, 113, 83, 70, 38, 124, 62, 53, 30, 127, 62, 55, 29, 127, 94, 80, 44, 127, 110, 93, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 93, 48, 127, 63, 55, 32, 127, 110, 92, 48, 127, 109, 91, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 108, 92, 47, 127, 56, 45, 20, 124, 56, 41, 10, 111, 55, 40, 10, 106, 48, 36, 10, 106, 39, 28, 10, 106, 25, 18, 6, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 62, 34, 105, 109, 92, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 108, 90, 46, 127, 76, 64, 36, 127, 61, 52, 29, 127, 67, 57, 31, 127, 86, 73, 39, 127, 89, 77, 44, 127, 102, 86, 45, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 49, 127, 109, 92, 49, 127, 96, 84, 45, 127, 97, 82, 42, 127, 110, 92, 47, 127, 61, 53, 31, 127, 110, 93, 48, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 51, 40, 19, 127, 71, 51, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 55, 40, 10, 123, 52, 37, 9, 109, 40, 30, 10, 106, 25, 18, 6, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 54, 31, 91, 93, 79, 41, 123, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 47, 127, 110, 93, 47, 127, 105, 90, 47, 127, 85, 72, 37, 127, 81, 69, 36, 127, 104, 89, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 108, 90, 46, 127, 71, 61, 34, 127, 68, 57, 30, 127, 106, 91, 48, 127, 99, 83, 44, 127, 66, 56, 31, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 111, 93, 49, 127, 47, 37, 14, 127, 72, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 51, 13, 127, 72, 51, 14, 127, 55, 40, 9, 123, 49, 36, 9, 109, 40, 30, 11, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 62, 34, 95, 95, 80, 41, 123, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 47, 127, 108, 93, 48, 127, 109, 92, 48, 127, 108, 92, 49, 127, 73, 63, 33, 127, 57, 52, 30, 127, 96, 83, 44, 127, 109, 92, 48, 127, 109, 92, 48, 127, 103, 87, 44, 127, 107, 91, 49, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 94, 81, 42, 127, 50, 36, 10, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 61, 44, 11, 123, 46, 33, 9, 109, 25, 18, 6, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 57, 31, 106, 104, 89, 45, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 93, 48, 127, 103, 87, 45, 127, 69, 58, 35, 127, 59, 51, 27, 127, 94, 80, 43, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 49, 127, 59, 49, 25, 127, 70, 49, 12, 127, 70, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 14, 127, 73, 51, 13, 127, 53, 38, 9, 123, 42, 32, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 37, 22, 79, 68, 57, 31, 120, 63, 53, 29, 127, 87, 74, 40, 127, 107, 92, 47, 127, 111, 93, 49, 127, 109, 93, 48, 127, 109, 93, 48, 127, 109, 92, 46, 127, 110, 93, 49, 127, 107, 92, 48, 127, 92, 78, 42, 127, 70, 58, 32, 127, 63, 54, 29, 127, 69, 58, 35, 127, 102, 86, 44, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 47, 127, 110, 93, 47, 127, 93, 80, 41, 127, 26, 19, 8, 127, 62, 44, 13, 127, 73, 51, 12, 127, 70, 52, 13, 127, 71, 52, 14, 127, 72, 52, 14, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 60, 44, 11, 123, 47, 34, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 68, 36, 108, 108, 92, 48, 127, 85, 72, 39, 127, 63, 52, 27, 127, 65, 57, 31, 127, 62, 53, 29, 127, 62, 53, 29, 127, 61, 53, 29, 127, 66, 57, 31, 127, 63, 52, 27, 127, 81, 69, 36, 127, 102, 87, 46, 127, 110, 94, 50, 127, 109, 92, 48, 127, 108, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 47, 127, 106, 88, 47, 127, 46, 36, 14, 127, 59, 43, 12, 127, 21, 16, 6, 127, 38, 30, 10, 127, 55, 40, 11, 127, 67, 48, 10, 127, 65, 46, 12, 127, 51, 37, 11, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 62, 44, 10, 123, 46, 34, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 60, 31, 106, 110, 92, 47, 127, 109, 92, 47, 127, 110, 93, 48, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 91, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 107, 90, 46, 127, 47, 37, 20, 127, 67, 48, 15, 127, 71, 53, 14, 127, 55, 41, 12, 127, 43, 31, 9, 127, 58, 43, 10, 127, 49, 37, 9, 127, 51, 39, 12, 127, 66, 46, 14, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 51, 13, 127, 60, 43, 11, 123, 40, 31, 12, 92, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 40, 20, 106, 106, 88, 47, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 102, 86, 46, 127, 40, 33, 18, 127, 59, 43, 12, 127, 71, 52, 12, 127, 71, 51, 12, 127, 72, 52, 14, 127, 57, 43, 13, 127, 42, 31, 8, 127, 70, 51, 15, 127, 72, 52, 13, 127, 71, 52, 15, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 14, 127, 71, 52, 13, 127, 54, 38, 11, 109, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 35, 26, 14, 53, 40, 13, 111, 57, 47, 23, 127, 110, 93, 46, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 93, 48, 127, 110, 92, 46, 127, 110, 93, 47, 127, 107, 92, 46, 127, 110, 92, 48, 127, 108, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 49, 127, 110, 93, 48, 127, 86, 74, 40, 127, 47, 36, 15, 127, 66, 48, 13, 127, 43, 32, 9, 127, 72, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 66, 47, 11, 127, 41, 30, 9, 127, 59, 42, 12, 127, 72, 52, 14, 127, 72, 52, 13, 127, 71, 52, 14, 127, 71, 51, 15, 127, 72, 52, 13, 127, 72, 51, 13, 127, 70, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 63, 45, 12, 123, 45, 34, 15, 109],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 37, 12, 96, 62, 45, 12, 124, 56, 42, 12, 127, 64, 53, 28, 127, 110, 93, 48, 127, 109, 92, 47, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 97, 83, 45, 127, 66, 56, 32, 127, 73, 61, 32, 127, 49, 41, 24, 127, 110, 93, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 102, 86, 46, 127, 57, 48, 26, 127, 54, 39, 13, 127, 71, 52, 14, 127, 71, 52, 13, 127, 45, 33, 11, 127, 64, 47, 16, 127, 72, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 72, 51, 13, 127, 52, 39, 10, 127, 39, 29, 10, 127, 54, 40, 11, 127, 71, 50, 12, 127, 72, 52, 12, 127, 61, 44, 11, 127, 53, 39, 13, 127, 72, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 13, 127, 52, 41, 17, 127],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 37, 10, 95, 61, 44, 12, 123, 70, 52, 12, 127, 71, 52, 13, 127, 57, 43, 14, 127, 57, 47, 26, 127, 105, 89, 46, 127, 109, 92, 47, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 72, 61, 32, 127, 45, 39, 21, 127, 95, 80, 43, 127, 3, 3, 3, 127, 85, 73, 39, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 49, 127, 110, 93, 47, 127, 108, 92, 48, 127, 109, 93, 47, 127, 98, 83, 44, 127, 59, 50, 28, 127, 45, 35, 15, 127, 67, 50, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 70, 51, 13, 127, 37, 28, 7, 127, 71, 50, 11, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 58, 43, 11, 127, 43, 31, 11, 127, 40, 30, 9, 127, 52, 37, 11, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 14, 127, 48, 35, 10, 127],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 30, 12, 91, 54, 40, 11, 109, 63, 46, 12, 123, 70, 52, 14, 127, 47, 34, 12, 127, 42, 31, 11, 127, 52, 38, 10, 127, 48, 36, 9, 127, 28, 23, 11, 127, 70, 60, 32, 127, 108, 90, 47, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 47, 127, 75, 64, 34, 127, 67, 57, 30, 127, 110, 92, 48, 127, 48, 42, 22, 127, 51, 43, 24, 127, 110, 92, 48, 127, 110, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 109, 92, 48, 127, 110, 92, 48, 127, 110, 92, 48, 127, 110, 93, 47, 127, 105, 87, 46, 127, 74, 64, 34, 127, 63, 61, 46, 127, 79, 79, 80, 127, 55, 51, 45, 127, 69, 49, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 63, 46, 12, 127, 43, 32, 9, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 51, 14, 127, 71, 52, 14, 127, 71, 52, 16, 127, 71, 52, 12, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 72, 52, 13, 127, 51, 38, 11, 127],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 32, 14, 95, 58, 42, 12, 123, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 51, 13, 127, 62, 46, 11, 127, 60, 44, 10, 127, 41, 30, 8, 127, 52, 39, 12, 127, 37, 29, 14, 127, 53, 45, 25, 127, 79, 67, 36, 127, 101, 86, 45, 127, 109, 93, 49, 127, 109, 92, 48, 127, 110, 92, 48, 127, 107, 92, 48, 127, 98, 82, 43, 127, 110, 94, 48, 127, 110, 91, 48, 127, 109, 92, 46, 127, 111, 94, 50, 127, 107, 91, 50, 127, 97, 83, 43, 127, 78, 65, 36, 127, 55, 47, 27, 127, 49, 45, 35, 127, 76, 76, 75, 127, 109, 109, 109, 127, 127, 127, 127, 127, 127, 127, 127, 127, 116, 116, 116, 127, 48, 39, 18, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 13, 127, 57, 43, 14, 127, 45, 33, 10, 127, 71, 52, 12, 127, 71, 52, 13, 127, 70, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 52, 40, 16, 127],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 32, 14, 95, 57, 42, 13, 123, 71, 51, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 71, 51, 15, 127, 45, 34, 11, 127, 54, 40, 12, 127, 71, 52, 14, 127, 38, 28, 10, 127, 49, 43, 35, 127, 103, 103, 105, 127, 8, 7, 7, 127, 20, 18, 14, 127, 66, 65, 56, 127, 43, 38, 20, 127, 59, 48, 22, 127, 59, 49, 22, 127, 52, 47, 22, 127, 46, 41, 27, 127, 67, 64, 60, 127, 71, 69, 60, 127, 73, 72, 70, 127, 87, 88, 87, 127, 5, 5, 7, 127, 1, 2, 1, 127, 23, 22, 23, 127, 125, 126, 124, 127, 126, 126, 126, 127, 127, 127, 127, 127, 126, 126, 126, 127, 126, 126, 126, 127, 72, 71, 67, 127, 67, 50, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 13, 127, 71, 52, 15, 127, 61, 45, 13, 127, 41, 29, 9, 127, 69, 50, 15, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 64, 49, 17, 123, 48, 37, 19, 109],\ [0, 0, 0, 0, 0, 0, 0, 0, 39, 30, 13, 91, 57, 42, 13, 123, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 51, 16, 127, 72, 51, 14, 127, 64, 47, 12, 127, 41, 30, 10, 127, 58, 44, 13, 127, 71, 52, 13, 127, 56, 42, 11, 127, 41, 29, 9, 127, 85, 85, 85, 127, 92, 92, 92, 127, 1, 1, 1, 127, 39, 39, 39, 127, 116, 118, 118, 127, 43, 31, 10, 127, 71, 52, 13, 127, 71, 52, 13, 127, 70, 52, 14, 127, 52, 47, 36, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 21, 21, 21, 127, 0, 0, 0, 127, 1, 1, 1, 127, 112, 112, 112, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 115, 115, 116, 127, 48, 37, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 15, 127, 55, 40, 12, 123, 41, 33, 15, 109, 53, 40, 13, 109, 63, 47, 14, 123, 72, 52, 14, 127, 72, 52, 13, 127, 71, 51, 13, 127, 72, 52, 13, 127, 72, 52, 13, 127, 72, 52, 13, 127, 71, 52, 13, 127, 72, 52, 13, 127, 72, 52, 14, 127, 73, 52, 15, 127, 66, 50, 19, 123, 54, 42, 20, 95, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 52, 39, 12, 109, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 60, 44, 10, 127, 42, 31, 10, 127, 44, 33, 10, 127, 69, 51, 13, 127, 70, 52, 14, 127, 71, 51, 14, 127, 40, 30, 8, 127, 41, 33, 17, 127, 123, 123, 123, 127, 70, 70, 70, 127, 0, 0, 0, 127, 78, 78, 78, 127, 104, 104, 105, 127, 51, 38, 11, 127, 71, 53, 14, 127, 71, 53, 14, 127, 71, 52, 16, 127, 54, 48, 38, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 53, 53, 53, 127, 1, 1, 1, 127, 1, 1, 1, 127, 85, 85, 85, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 57, 52, 42, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 15, 127, 55, 40, 11, 109, 0, 0, 0, 0, 0, 0, 0, 0, 43, 34, 17, 91, 52, 40, 18, 109, 59, 45, 18, 123, 76, 59, 24, 127, 75, 57, 21, 127, 74, 56, 20, 127, 74, 55, 19, 127, 75, 56, 20, 127, 75, 58, 23, 127, 78, 61, 27, 127, 66, 52, 24, 123, 54, 43, 22, 95, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 45, 33, 9, 91, 59, 43, 12, 123, 45, 33, 10, 127, 40, 29, 8, 127, 40, 30, 9, 127, 42, 32, 9, 127, 39, 31, 10, 127, 50, 37, 10, 127, 69, 50, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 64, 46, 12, 127, 46, 34, 11, 127, 59, 57, 53, 127, 126, 126, 126, 127, 91, 91, 91, 127, 32, 32, 32, 127, 122, 122, 122, 127, 82, 81, 81, 127, 63, 46, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 51, 46, 34, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 97, 97, 97, 127, 1, 1, 1, 127, 1, 1, 1, 127, 73, 73, 73, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 127, 75, 75, 73, 127, 69, 50, 13, 127, 70, 52, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 14, 127, 52, 38, 10, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 22, 12, 91, 44, 36, 19, 105, 53, 42, 20, 106, 59, 48, 22, 106, 63, 49, 23, 106, 63, 49, 23, 106, 59, 48, 24, 106, 52, 43, 23, 106, 43, 36, 20, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 57, 42, 12, 109, 71, 52, 14, 127, 71, 52, 14, 127, 70, 52, 12, 127, 70, 52, 12, 127, 70, 53, 14, 127, 71, 51, 14, 127, 71, 52, 15, 127, 69, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 72, 53, 16, 127, 48, 38, 16, 127, 56, 40, 9, 127, 84, 86, 86, 127, 126, 126, 126, 127, 126, 126, 126, 127, 126, 126, 126, 127, 126, 126, 126, 127, 59, 56, 51, 127, 72, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 73, 51, 11, 127, 50, 42, 27, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 125, 125, 127, 38, 38, 38, 127, 1, 1, 1, 127, 82, 82, 82, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 99, 99, 99, 127, 58, 41, 13, 127, 71, 52, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 51, 15, 127, 48, 36, 10, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [53, 43, 22, 109, 65, 48, 15, 123, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 51, 14, 127, 71, 51, 14, 127, 73, 55, 17, 127, 80, 63, 32, 127, 45, 36, 17, 127, 53, 39, 11, 127, 105, 106, 105, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 122, 122, 122, 127, 44, 34, 19, 127, 70, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 46, 37, 18, 127, 126, 126, 126, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 119, 119, 119, 127, 85, 85, 85, 127, 123, 123, 123, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 119, 119, 119, 127, 44, 33, 10, 127, 70, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 46, 35, 12, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [57, 48, 29, 127, 73, 54, 18, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 70, 51, 14, 127, 72, 53, 15, 127, 75, 58, 22, 127, 81, 65, 34, 127, 81, 66, 35, 127, 44, 33, 14, 127, 53, 40, 11, 127, 104, 105, 105, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 80, 80, 80, 127, 61, 45, 12, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 72, 52, 16, 127, 49, 36, 10, 127, 114, 114, 114, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 42, 36, 17, 127, 70, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 41, 33, 12, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 28, 127, 79, 62, 29, 127, 71, 53, 16, 127, 71, 52, 13, 127, 70, 52, 14, 127, 70, 52, 14, 127, 70, 53, 13, 127, 71, 53, 16, 127, 75, 57, 22, 127, 80, 63, 32, 127, 81, 66, 35, 127, 73, 59, 31, 123, 64, 52, 27, 112, 48, 37, 15, 123, 64, 49, 13, 127, 70, 67, 68, 127, 125, 126, 125, 127, 126, 127, 125, 127, 113, 115, 115, 127, 46, 38, 22, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 72, 52, 15, 127, 61, 45, 13, 127, 90, 90, 90, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 50, 42, 19, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 59, 44, 12, 118, 38, 31, 13, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [54, 45, 26, 109, 70, 57, 29, 123, 80, 64, 33, 127, 77, 60, 27, 127, 75, 57, 24, 127, 76, 58, 25, 127, 77, 61, 28, 127, 81, 65, 33, 127, 82, 67, 36, 127, 80, 67, 35, 127, 69, 57, 30, 123, 58, 48, 28, 95, 0, 0, 0, 0, 42, 32, 12, 95, 59, 44, 13, 123, 52, 38, 15, 127, 63, 61, 57, 127, 78, 79, 78, 127, 46, 41, 26, 127, 68, 50, 13, 127, 68, 49, 13, 127, 70, 51, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 16, 127, 71, 51, 13, 127, 68, 65, 60, 127, 126, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 43, 39, 19, 127, 71, 51, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 51, 38, 10, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 58, 47, 24, 95, 69, 55, 28, 123, 82, 66, 36, 127, 81, 66, 35, 127, 81, 66, 35, 127, 80, 67, 35, 127, 81, 66, 34, 127, 71, 57, 30, 123, 62, 51, 27, 109, 49, 40, 24, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 41, 11, 109, 71, 52, 16, 127, 68, 50, 12, 127, 65, 47, 13, 127, 71, 52, 14, 127, 68, 50, 15, 127, 40, 30, 10, 127, 71, 52, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 51, 41, 28, 127, 124, 126, 125, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 120, 120, 120, 127, 44, 33, 11, 127, 70, 51, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 51, 15, 127, 61, 45, 12, 123, 43, 33, 12, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 44, 36, 19, 91, 53, 43, 23, 105, 59, 47, 25, 106, 58, 48, 27, 106, 57, 46, 25, 106, 52, 43, 26, 106, 44, 36, 22, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 32, 11, 91, 59, 43, 13, 123, 72, 52, 16, 127, 72, 52, 15, 127, 70, 51, 14, 127, 41, 30, 9, 127, 65, 47, 13, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 54, 41, 10, 127, 99, 99, 99, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 97, 97, 97, 127, 58, 43, 11, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 15, 127, 52, 39, 11, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 32, 11, 91, 51, 38, 10, 105, 50, 37, 10, 106, 44, 33, 12, 109, 55, 42, 21, 123, 73, 54, 18, 127, 70, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 56, 52, 47, 127, 126, 126, 127, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 126, 124, 127, 68, 67, 62, 127, 71, 52, 14, 127, 70, 51, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 59, 43, 12, 123, 40, 31, 12, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 36, 21, 95, 64, 50, 22, 123, 72, 53, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 52, 39, 13, 127, 98, 99, 96, 127, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 116, 117, 116, 127, 47, 38, 17, 127, 71, 52, 15, 127, 71, 52, 14, 127, 71, 52, 14, 127, 62, 45, 12, 123, 47, 35, 10, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 38, 20, 95, 63, 49, 21, 123, 72, 53, 16, 127, 71, 51, 14, 127, 71, 52, 14, 127, 71, 52, 14, 127, 57, 42, 11, 127, 73, 52, 15, 127, 47, 40, 26, 127, 116, 117, 117, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 125, 126, 124, 127, 123, 124, 123, 127, 55, 51, 44, 127, 69, 51, 14, 127, 45, 33, 9, 127, 69, 50, 14, 127, 71, 52, 15, 127, 47, 34, 9, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 36, 19, 92, 59, 45, 20, 110, 66, 49, 16, 123, 71, 52, 14, 127, 71, 52, 14, 127, 53, 39, 11, 127, 55, 41, 11, 127, 69, 50, 14, 127, 52, 46, 29, 127, 113, 113, 113, 127, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 114, 115, 115, 127, 56, 52, 45, 127, 65, 48, 15, 127, 64, 47, 13, 127, 44, 33, 11, 127, 70, 51, 13, 127, 51, 37, 10, 123, 25, 19, 7, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 41, 33, 14, 53, 42, 19, 96, 63, 48, 17, 123, 72, 52, 14, 127, 71, 52, 12, 127, 40, 30, 9, 127, 67, 50, 12, 127, 70, 51, 15, 127, 48, 38, 16, 127, 69, 69, 65, 127, 97, 98, 98, 127, 105, 108, 106, 127, 90, 90, 91, 127, 62, 61, 55, 127, 47, 37, 17, 127, 68, 51, 13, 127, 70, 52, 13, 127, 38, 28, 9, 127, 70, 51, 14, 127, 56, 41, 11, 123, 38, 29, 8, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 35, 17, 91, 57, 43, 16, 109, 62, 46, 14, 123, 67, 49, 12, 127, 37, 26, 11, 127, 70, 51, 13, 127, 70, 52, 15, 127, 69, 50, 14, 127, 57, 42, 12, 127, 56, 42, 12, 127, 60, 44, 13, 127, 71, 52, 13, 127, 71, 52, 13, 127, 71, 52, 14, 127, 43, 32, 10, 127, 61, 46, 12, 127, 57, 42, 12, 123, 41, 31, 12, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 33, 13, 91, 49, 37, 13, 106, 48, 35, 11, 111, 47, 34, 10, 124, 65, 48, 13, 127, 69, 52, 13, 127, 70, 51, 15, 127, 70, 52, 14, 127, 70, 53, 15, 127, 71, 53, 14, 127, 70, 51, 13, 127, 44, 32, 9, 127, 57, 42, 13, 127, 55, 40, 11, 123, 42, 32, 12, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 25, 19, 14, 47, 35, 10, 114, 43, 31, 9, 127, 45, 33, 13, 127, 59, 43, 11, 127, 69, 49, 13, 127, 64, 46, 11, 127, 47, 35, 12, 127, 40, 30, 10, 127, 64, 46, 11, 127, 55, 40, 11, 123, 42, 31, 11, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 35, 12, 96, 61, 44, 12, 124, 71, 52, 15, 127, 68, 50, 14, 127, 54, 39, 11, 127, 46, 35, 9, 127, 51, 38, 10, 127, 64, 46, 14, 127, 72, 52, 15, 127, 56, 41, 13, 123, 41, 31, 12, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 23, 20, 56, 36, 27, 19, 81, 34, 27, 14, 89, 36, 27, 11, 102, 42, 31, 12, 105, 49, 35, 10, 109, 58, 42, 11, 123, 71, 52, 13, 127, 67, 48, 13, 127, 51, 36, 11, 127, 68, 50, 14, 127, 71, 52, 16, 127, 71, 53, 16, 127, 62, 45, 12, 123, 53, 40, 11, 109, 39, 30, 13, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 21, 12, 49, 34, 26, 11, 91, 41, 30, 9, 101, 46, 34, 10, 105, 47, 35, 9, 105, 45, 32, 8, 106, 45, 33, 10, 106, 37, 29, 11, 109, 30, 24, 11, 123, 40, 34, 18, 127, 71, 52, 15, 127, 71, 52, 13, 127, 58, 43, 12, 123, 47, 35, 11, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 27, 10, 113, 51, 39, 12, 124, 57, 42, 12, 111, 49, 36, 13, 106, 36, 29, 13, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 15, 7, 88, 35, 26, 9, 109, 44, 34, 11, 123, 44, 35, 13, 112, 29, 29, 20, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\ ]\ )\ if(__name__ == "__main__"): load_RegistryInfo() Blender.Draw.Register(draw,event,bevent)